2016-05-15 9 views
1

Ich versuche FakeItEasy 1.25.3 zu bekommen, eine Ausnahme auf eine Eigenschaft zu werfen; Der Setter-Test funktioniert einwandfrei, aber der Getter löst keine Ausnahme wie erwartet aus. Was mache ich falsch?FakeItEasy Eigenschaft Getter Call-Regel nicht ausgelöst

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

Versuchen Sie, diese Zeile 'Treiber zu kommentieren .IntProperty = 3; ' –

+0

@YacoubMassad Das funktioniert, danke. Also ich vermute, mit der Eigenschaft Setter wird die Anrufregel für die Eigenschaft Getter entfernen? –

+0

Ja. Wenn Sie einen Eigenschaftswert festlegen, richtet er den Getter so ein, dass er diesen Wert zurückgibt, wenn er aufgerufen wird. –

Antwort

2

Es ist diese Zeile:

driver.IntProperty = 3; 

, dass Ihr Problem verursacht. Im Grunde ist es so konfiguriert, dass der Getter den Wert 3 zurückgibt, wenn er aufgerufen wird.

Dies ist, weil IntProperty eine Lese-/Schreibeigenschaft ist. Weitere Informationen finden Sie unter this.

aus dem obigen Link Zitiert:

Obwohl Sie explizit den Rückgabewert für eine angerufene Eigenschaft Getter angeben können, gibt es eine einfachere, intuitive Art und Weise mit Lese-/Schreibeigenschaften zu arbeiten. Standardmäßig verhält sich jede fälschbare Eigenschaft, die sowohl einen set- als auch einen get-Accessor aufweist, wie erwartet. Wenn Sie einen Wert festlegen und dann den Wert abrufen, wird der Wert zurückgegeben, der festgelegt wurde.

Darüber hinaus beachten Sie, dass das Verhalten, das Sie mit 2.0 FakeItEasy ändern gesehen hat, wird aufgrund der Fix für magic property get followed by another get returns different object when property type is not fakeable. Mit dieser Änderung wären Ihre beiden Tests ungefähr genauso gescheitert - Property_Setter_Throws würde ebenfalls fehlschlagen, weil die Verwendung des Getters für driver.IntProperty FakeItEasy primieren würde, um dieselbe Rückgabewertinstanz in der Zukunft zurückzugeben (es wird eine automatische Eigenschaftsregel eingerichtet)).

Und als weiteres Bit an Information, die Sie in der Zukunft helfen können, können Sie zum Einrichten Eigenschaft Verhalten mit typsichere Methoden genießen:

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

kann sich

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

(und in FakeItEasy 2.0, gibt es a similar method for configuring Property Setters):

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