2010-02-09 4 views
2

Moq 종속성을 사용하는 클래스를 테스트 할 때 클래스가 직접 테스트 케이스에서 인수를 만드는 대신 Moq 메서드에 인수를 제공하기를 바랍니다.구현에서 자체 인수를 사용하여 모의 (Moq) 메소드를 호출하도록 허용하려면 어떻게해야합니까?

하나의 인수를 취하는 하나의 메소드가있는 인터페이스가 있습니다.

public interface IMessageForwardProxy 
{ 
    IMessage Send(IMessage request); 
} 

클래스에 대해 호출 된 메서드에 따라 여러 가지 인수로이 메서드를 호출하는 클래스가 있습니다. 예를 들면 : 당신이 볼 수있는

public class Messenger 
{ 
    private IMessageForwardProxy _link; 

    public Messenger(IMessageForwardProxy proxy) { _link = proxy; } 

    public bool DeliverSomeMessage() { 
     IMessage m1 = new MessageOne(); 
     var response = _link.Send(m1); 
     return response.Succeeded; 
    } 

    public bool DeliverSomeOtherMessage() { 
     IMessage m2 = new MessageTwo(); 
     var response = _link.Send(m2); 
     return response.Succeeded; 
    } 
} 

이제 메신저 클래스는 인터페이스의 Send 메서드에 전달되는 인수를 만들기위한 책임이 있습니다. 이 Messenger 클래스를 테스트 할 때 테스트에서 인수를 제공하지 않고 IMessageForwardProxy의 Send 메서드를 모의하고 싶습니다. 필자는 테스트를 구현 (및 작업 복제)에 연결하는 것으로 논쟁을 제공합니다.

Messenger 클래스에서 DeliverSomeOtherMessage 메서드를 테스트하려는 경우 어떻게 IMessageForwardProxy를 조롱합니까?

mockProxy.Setup(m => m.Send(It.Is<IMessage>(m => m is MessageTwo))) 
    .Returns(new ReturnMessageTwo()); 

이 일치하는 경우에만 해당됩니다

이 경우
mockProxy.Setup(m => m.Send(It.IsAny<IMessage>())).Returns(new ReturnMessageTwo()); 

답변

2

이 같이 It.IsAny<IMessage>()

을 사용할 수 있습니다 It.Is 메서드에 전달 된 예상자가 true로 평가되므로이 Set up 및 해당 반환 값은 DeliverSomeOtherMessage 메서드를 호출 할 때만 사용됩니다.

2

, 당신은 It.Is<IMessage> 기대 일치를 사용할 수 있습니다

[Test] 
public void TestDeliverSomeOtherMessage() { 
    var mockProxy = new Mock<IMessageForwardProxy>(); 

    // This is what I want to avoid, since the method I'm testing creates this argument 
    IMessage m2 = new MessageTwo(); 
    mockProxy.Setup(m => m.Send(m2)).Returns(new ReturnMessageTwo()); 

    // Can I do something like this instead? Define the signature, but not the param? 
    mockProxy.Setup(m => m.Send(typeof(IMessage))).Returns(new ReturnMessageTwo()); 

    var messenger = new Messenger(mockProxy.Object); 
    Assert.True(messenger.DeliverSomeOtherMessage()); 

} 
+0

'It.IsAny ()'과 같지 않습니까? –

+0

@Jeff Cyr : 서명 (MessageTwo) 서명이있는 메소드와 일치 할 것이므로이 메소드가 존재하지 않으므로 아니오입니다. –

관련 문제