NSusbtitute неправильно вычисляет количество вызовов на макет

62
7

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 был вызван дважды, а не трижды. Отладка показывает, что метод называется трижды.

спросил(а) 2020-03-24T13:57:36+03:00 1 год назад
1
Решение
76

Документация NSubstitute

Использование Arg.Is или Arg.Any без вызова.Returns или Received() может привести к тому, что ваши тесты будут вести себя непредсказуемыми способами. Смотрите, как НЕ использовать аргументы для получения дополнительной информации.

Попробуйте передать в 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>());
}

ответил(а) 2020-03-24T14:13:36.452264+03:00 1 год назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема