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