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方法被调用了两次,而不是三次。调试显示该方法被调用三次。
答案 0 :(得分:2)
在没有调用.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>());
}