Проверка количества вызовов методов в выражении выбора linq

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