#c# #moq #xunit
#c# #moq #xunit
Вопрос:
Мой модульный тест проверяет количество раз, когда вызывается издевательский метод:
Настройка тестирования
var mockedDependency= new Mock<IDependeny>();
mockedDependency.Setup(x => x.CheckSomething(It.IsAny<string>())).Returns(true);
//make sure CheckSomething is called x times
//verify
mockedDependency.Verify(x => x.CheckSomething(It.IsAny<string>()), Times.Exactly(xtimes));
Вызов CheckSomething
Это работает (показывает правильное количество вызовов x):
//var itemsToCheck = some array
CheckResults[] checks = new CheckResults[knownLegth];
for (int i = 0; i < checks.Length; i )
{
checks[i] = new CheckResults
{
Name = itemsToCheck[i],
Valid = dependency.CheckSomething(itemsToCheck [i])
};
}
Но это не работает (показывает нулевые вызовы CheckSomething):
var checks = itemsToCheck .Select(x => new CheckResults
{
Name = x,
Valid = dependency.CheckSomething(x)
});
Для обоих подходов CheckSomething выполняется корректно, возвращая true .
Есть ли конкретная причина, по которой проверка moq не работает в выражении выбора linq?
Использование moq v4.15.1
Комментарии:
1.
Select
не повторяйте перечисление. Вам нужно добавить.ToList()
, чтобы принудительно выполнить итерацию.2. @Vernou, спасибо, что указали на оплошность. Модульное тестирование контроллера, возвращающего ActionResult<IEnumerable<CheckResults>>, должно будет вызвать ActionResult . Результат. Значение. ToList() в модульных тестах для обеспечения итерации и предотвращения редактирования кода в контроллере.
Ответ №1:
Решение Согласно комментарию @Vernou, непосредственно вызовите ToList() в методе тестирования.
Как бы исправить мою проблему.
Поскольку я тестировал контроллер, возвращающий ActionResult<IEnumerable> , чтобы предотвратить внесение изменений в код в контроллере, вызовите ToList() в модульном тестировании:
[Fact]
public void My_Unit_Test()
{
int checks = 10;
string[] items= new string[checks];
var mockedDependency= new Mock<IDependeny>();
mockedDependency.Setup(x => x.CheckSomething(It.IsAny<string>()))
.Returns(true);
var myController= new MyController(mockedDependency.Object);
var actionResult = myController.CallMethod(items);
var actionResult = dailyStockPricesController.Verify(fileNames);
var okResult = actionResult.Result as OkObjectResu<
Assert.NotNull(okResult);
var value = (IEnumerable<FileUploadVerification>)okResult.Value;
Assert.Equal(10, value.ToList().Count); //call ToList() at least once
mockedDependency.Verify(x => x.CheckSomething(It.IsAny<string>()), Times.Exactly(checks));
}