2014-09-11 2 views
1

Moq를 사용하여 "CallWithRef"메서드가 호출되었는지 어떻게 확인할 수 있습니까? MOQ에 VerifyMoq를 사용하여 ref 매개 변수를 사용하여 호출 확인

public interface ITest 
{ 
    void CallWithoutRef(string value, List<string> errors); 
    void CallWithRef(string value, ref List<string> errors); 
} 

public class Foo 
{ 
    private ITest testInterface; 

    public Foo(ITest testInterface) 
    { 
     this.testInterface = testInterface; 
    } 

    public void DoStuff(string value) 
    { 
     var errorList = new List<string>(); 
     testInterface.CallWithoutRef(value, errorList); 
     testInterface.CallWithRef(value, ref errorList); 
    } 
} 

[TestMethod] 
public void VerifyTestInterfaceCalls() 
{ 
    var expectedValue = Path.GetRandomFileName(); 
    var mockTestInterface = new Mock<ITest>(); 
    var foo = new Foo(mockTestInterface.Object); 

    foo.DoStuff(expectedValue); 
    mockTestInterface.Verify(x => x.CallWithoutRef(expectedValue, It.IsAny<List<string>>())); 

    // Test fails here: 
    var errorList = It.IsAny<List<string>>(); 
    mockTestInterface.Verify(x => x.CallWithRef(expectedValue, ref errorList)); 
} 

답변

7

통화 ref 인수에 대해 엄격한 평등 검사를 수행. 인수가 참조 유형 인 경우 (예와 같이) argument matcher that Moq uses은 실제 값과 예상 값이 인 동일한 참조 인 경우에만 성공합니다. 이것은 평등을 확인하기 위해 object.ReferenceEquals(expected, actual)을 사용하기 때문입니다. 당신의 예에서

// ref arguments 
var instance = new Bar(); 
// Only matches if the ref argument to the invocation is the same instance 
mock.Setup(foo => foo.Submit(ref instance)).Returns(true); 

It.IsAny<List<string>>() 실제로 결국 default(T)을 반환 새에 null을 비교하고 있으므로, 상기 Moq Quickstart에 (조금 더 철저 할 수 있지만)

이 문제는 언급 예를 들어, 은 DoStuff에 작성되었으며, 이는 정규 표현식 구현에 따라 실패합니다.

var errorList = It.IsAny<List<string>>(); 
// var errorList = new List<string>(); // also works 

foo.DoStuff(expectedValue, errorList); 

mockTestInterface.Verify(x => x.CallWithoutRef(expectedValue, It.IsAny<List<string>>())); 
mockTestInterface.Verify(x => x.CallWithRef(expectedValue, ref errorList)); 
:

그래서 나는 당신이 무엇을해야하는지 제시 할 수는 없지만 자신을 목록을 받아 들일 것이 아니라 만들 DoStuff을 수정하는 경우,이 같은 테스트 할 수 분명히 장난감의 예입니다
관련 문제