2017-04-26 44 views
1
public class Device 
{ 
    private readonly IProtocol _protocol; 

    public Device(IProtocol protocol) 
    { 
     _protocol = protocol; 
    } 

    public bool Connect(string port) 
    { 
     for (int i = 0; i < 3; i++) 
     { 
      if (_protocol.Connect(port)) 
       return true; 
     } 
     return false; 
    } 
} 
public interface IProtocol 
{ 
    bool Connect(string port); 
} 

    [Test] 
    public void Connect_FailedThrice_ThreeTries() 
    { 
     IProtocol provider = Substitute.For<IProtocol>(); 
     provider.Connect(Arg.Any<string>()).Returns(false); 

     var sut = new Device(provider); 
     sut.Connect(Arg.Any<string>()); 

     provider.Received(3).Connect(Arg.Any<string>()); 
    } 

运行单元测试的结果 - 一个错误说明连接方法被调用两次,而不是三次。调试显示该方法被称为三次。NSusbtitute错误地计算了模拟调用的次数

回答

2

NSubstitute documentation

使用Arg.Is或Arg.Any没有到.Returns或者接收()的调用可能会导致你的测试以意想不到的方式行事。请参阅如何不使用参数匹配器获取更多信息。

尝试在sut.Connect方法的任何字符串

[TestMethod] 
public void Connect_FailedThrice_ThreeTries() 
{ 
    IProtocol provider = Substitute.For<IProtocol>(); 
    provider.Connect(Arg.Any<string>()).Returns(false); 

    var sut = new Device(provider); 
    sut.Connect("hello"); 

    provider.Received(3).Connect(Arg.Any<string>()); 
} 
+0

它的工作原理通过。谢谢。嗯...似乎从NSubstitute的API角度来看非常不一致。这种行为远不是显而易见的。 – EngineerSpock

+0

@EngineerSpock好吧,我发现了:) – Valentin