2013-06-27 40 views
4

執行我有了2個回調動作類:斷言回調動作與NUnit的

public class MyClass 
{ 
    public void DoSomething(Action onSuccess, Action onFailure) 
    { } 
} 

我試圖寫這樣的測試,但不知道如何「斷言」我onSuccess被執行了?

[Test] 
public void ChangePassword_returns_false_if_user_does_not_exist() 
{ 
    var myClass = new MyClass(mockedDependency.Object); 

    myClass.DoSomething(//what do i need to pass in, in order to Assert that onSuccess Action was executed?) 
} 

回答

5

您可以創建一個改變一些標誌動作:

[Test] 
public void ChangePassword_returns_false_if_user_does_not_exist() 
{ 
    var myClass = new MyClass(mockedDependency.Object); 
    bool isExecuted = false; // flag to check 
    Action success =() => isExecuted = true; // set flag to true when executed 

    myClass.DoSomething(success, null); 
    Assert.IsTrue(isExecuted); // check if flag changed 
} 

甚至使用就地拉姆達改變標誌:

[Test] 
public void ChangePassword_returns_false_if_user_does_not_exist() 
{ 
    var myClass = new MyClass(mockedDependency.Object); 
    bool isExecuted = false; // flag to check 
    myClass.DoSomething(() => isExecuted = true, null); 
    Assert.IsTrue(isExecuted); // check if flag changed 
} 

還有一個辦法 - 你可以使用Moq來驗證行動是否被調用。在這種情況下,你不需要任何標誌。首先,你需要匹配Action委託簽名方法的一些接口:

public interface IHelper // consider better name 
{ 
    void ShouldRun(); 
    void ShouldNotRun(); 
} 

然後你可以使用模擬來驗證次行動被稱爲:

[Test] 
public void ChangePassword_returns_false_if_user_does_not_exist() 
{ 
    Mock<IHelper> helper = new Mock<IHelper>();    
    var myClass = new MyClass(ockedDependency.Object); 
    myClass.DoSomething(helper.Object.ShouldRun, helper.Object.ShouldNotRun); 

    helper.Verify(h => h.ShouldRun(), Times.Once()); 
    helper.Verify(h => h.ShouldNotRun(), Times.Never()); 
} 
+2

真的很喜歡最後一種方式看,謝謝:) – Alex