2013-06-27 2 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을 사용하십시오. 이 경우 플래그가 필요하지 않습니다. 호출 된

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

가 그런 다음 시간 작업을 확인하기 위해 모의를 사용할 수 있습니다 : 먼저 Action 위임 서명을 일치하는 방법 몇 가지 인터페이스를 필요

[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

관련 문제