2013-06-27 42 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