Лямбда-функция, вызывающая ошибку компилятора с 0 аргументами, исключение с 1 или более

#c# #lambda #moq #xunit #stub

#c# #лямбда #moq #xunit #заглушка

Вопрос:

Я использую лямбда-функцию в среде C # .NET CORE с Moq. Более конкретно, я использую ее в методе настройки следующим образом:

 MockObject.Setup(o => o.GetList()).Returns<List<DifferentClass>>(() => Task.FromExisting(existingList));
  

Проблема в вызове .Returns(). Если я использую пустой лямбда-код, я получаю следующую ошибку компилятора:

   error CS1593: Delegate 'Func<List<DifferentClass>,  Task<List<DifferentClass>>>' does not take 0 arguments.
  

Это означает, что мне нужно добавить аргумент к лямбде. Я делаю это следующим образом:

 MockObject.Setup(o => o.GetList()).Returns<List<DifferentClass>>(o => Task.FromExisting(existingList));
  

Теперь вместо ошибки компилятора генерируется исключение:

 System.ArgumentException : Invalid callback. Setup on method with 0 parameter(s) cannot invoke callback with different number of parameters (1).
  

Трассировка стека ссылается на ту же строку кода.

Вот пример кода:

Тесты:

 public class UnitTest1
{
    static readonly Mock<IMyClass> MockObject;

    static UnitTest1()
    {
        MockObject = new Mock<IMyClass>();
        var existingList = new List<DifferentClass>();
        // Line causing exception below
        MockObject.Setup(o => o.GetList()).Returns<List<DifferentClass>>(() => Task.FromExisting(existingList));
    }

    // Tests go here...
    [Fact]
    Test1()
    {
        //...
    }
}
  

Вот издевательский класс, IMyClass:

 public interface IMyClass
{
    Task<List<DifferentClass>> GetList();
}
  

Похоже, что мои два варианта — создать исключение или не выполнить компиляцию. Я не уверен, что я могу здесь сделать. Если я чего-то не понимаю, пожалуйста, дайте мне знать.

Ответ №1:

Учитывая определение издевательского интерфейса, просто вызовите .ReturnsAsync(existingList); , и тип будет выведен.

 static UnitTest1()
{
    MockObject = new Mock<IMyClass>();
    var existingList = new List<DifferentClass>();
    MockObject
        .Setup(o => o.GetList())
        .ReturnsAsync(existingList);
}