2016-05-15 3 views
1

FakeItEasy 1.25.3をプロパティに例外をスローするようにしようとしています。セッターテストは正常に動作しますが、ゲッターは予期したように例外をスローしません。私は間違って何をしていますか?FakeItEasyプロパティgetter呼び出しルールがトリガーされていません

public interface IMisc 
{ 
    int IntProperty { get; set; } 
} 

// Setter throws exception as expected. 
[Test] 
public void Property_Setter_Throws() 
{ 
    var driver = A.Fake<IMisc>(); 
    A.CallTo(driver).Where(call => call.Method.Name == "set_IntProperty") 
      .Throws(new Exception()); 
    var i = driver.IntProperty; 
    Assert.That(delegate { driver.IntProperty = 3; }, Throws.Exception); 
} 

// Getter does not throw exception as expected. 
[Test] 
public void Property_Getter_Throws() 
{ 
    var driver = A.Fake<IMisc>(); 
    A.CallTo(driver).Where(call => call.Method.Name == "get_IntProperty") 
      .Throws(new Exception()); 
    driver.IntProperty = 3; 
    Assert.That(delegate { var i = driver.IntProperty; }, Throws.Exception); 
} 
+1

この行の 'ドライバ.IntProperty = 3; ' –

+0

@ YacoubMassadこれはうまくいきました。だから私は、プロパティのgetterの呼び出しルールを削除するプロパティの設定を使用して推測している? –

+0

はい。プロパティ値を設定すると、呼び出されるとその値を返すようにゲッターを設定します。 –

答えて

2

それはこの行です:

driver.IntProperty = 3; 

あなたの問題を引き起こしています。基本的には、呼び出されたときに値3を返すようにゲッターを設定することです。

これは、IntPropertyが読み取り/書き込みプロパティであるためです。詳細については、thisを参照してください。あなたが明示的に呼ばれるプロパティのゲッターの戻り値を指定できますが

は、読み取り/書き込みプロパティで動作するように簡単に、より直感的な方法があります:上記のリンクから引用

。デフォルトでは、setとget accessorの両方を持つ偽装可能なプロパティは、期待どおりの動作をします。値を設定してから値を取得すると、設定された値が返されます。また

は、あなたが見た振る舞いが原因 magic property get followed by another get returns different object when property type is not fakeableの修正に、FakeItEasy 2.0で変更されることに注意してください。 driver.IntPropertyのゲッターを使用すると、FakeItEasyが将来同じ戻り値のインスタンスを返すようになるため、2つのテストはほぼ同じ方法で失敗します。Property_Setter_Throwsも失敗します(自動プロパティールールを設定しています) )。

、将来的にあなたを助けるかもしれない情報の更なるビットとして、あなたは、プロパティの動作を設定するための型保証された方法を使用して楽しむことがあります。

A.CallTo(driver).Where(call => call.Method.Name == "get_IntProperty") 
       .Throws(new Exception()); 

A.CallTo(() => driver.IntProperty).Throws(new Exception()); 

(およびになることができますFakeItEasy 2.0、a similar method for configuringプロパティセッターがあります):

A.CallToSet(() => driver.IntProperty).Throws(new Exception()); 
関連する問題