NSusbtitute错误地计算了模拟的调用次数

时间:2017-04-26 10:19:08

标签: c# unit-testing mocking nsubstitute

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>());
    }

运行单元测试的结果 - 一个错误说Connect方法被调用了两次,而不是三次。调试显示该方法被调用三次。

1 个答案:

答案 0 :(得分:2)

NSubstitute documentation

  

在没有调用.Returns或Received()的情况下使用Arg.Is或Arg.Any会导致测试以意想不到的方式运行。有关更多信息,请参见如何不使用参数匹配器。

尝试传递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>());
}