У меня есть интерфейс, определенный следующим образом:
public interface TestInterface
{
List<string> TestMethod(List<string> ids);
List<string> TestMethod(List<string> ids, bool testBool);
}
Этот интерфейс реализован классом с именем TestClass
, но это не важно.
Теперь у меня естьмодульный тест, который выполняет следующее:
List<string> testReturnData = GetSomeTestReturnData(); //Not important
Mock<TestInterface> mockedInterface = new Mock<TestInterface>();
mockedInterface.Setup(d => d.TestMethod(It.IsAny<IEnumerable<string>>(), true).Returns(testReturnData);
Затем, в конце концов, я запускаю модульный тест, который, в свою очередь, запускает некоторый фактический код, в котором используется вышеуказанный mockedInterface
:
List<string> someValidInput = GetSomeValidInput(); //Not important
// Line causing the exception. testInterfaceInstance is actually the mocked interface
// instance, passed in as a reference
List<string> returnData = testInterfaceInstance.TestMethod(someValidInput, true);
Когдавышеупомянутая строка выполняется, немедленно генерируется следующее исключение:
System.Reflection.TargetParameterCountException: Несоответствие количества параметров.
Может кто-нибудь объяснить, почему это происходит? Я предоставляю действительное количество входов. Ожидаемое поведение заключается в том, что вызов вышеупомянутого должен вернуть testReturnData
, что было упомянуто ранее.
В настройке поддельного интерфейса, даже если я заменю true
на It.IsAny<Boolean>()
, это все равно не решит проблему.
РЕДАКТИРОВАТЬ:
На самом деле я понял проблему. В фиктивной установке был обратный вызов, который использовал только один входной параметр, что приводило в замешательство компилятор. Я не думал, что это важно, поэтому я оставил это в стороне :) ... Подробнее: Фактический вызов был таким:
mockedInterface.Setup(d => d.TestMethod(It.IsAny<IEnumerable<string>>(), true).Returns(testReturnData)
.Callback<IEnumerable<string>>(u =>
{
u.ToList();
});
Мне просто пришлось изменить Callback
на это:
mockedInterface.Setup(d => d.TestMethod(It.IsAny<IEnumerable<string>>(), true).Returns(testReturnData)
.Callback<IEnumerable<string>, Boolean>((u, v) =>
{
u.ToList();
});
А потом тест прошел нормально. :)