Получение "Несоответствие количества параметров" без причины - PullRequest
0 голосов
/ 14 октября 2019

У меня есть интерфейс, определенный следующим образом:

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

А потом тест прошел нормально. :)

1 Ответ

1 голос
/ 14 октября 2019

Я думаю, что в вашем примере кода чего-то не хватает. Получаете ли вы .Object от вашего макета?

На основании вашего кода я могу произвести это, а это не выдает:

using System.Collections.Generic;
using Moq;
using Xunit;

namespace XUnitTestProject1
{
    public interface TestInterface
    {
        List<string> TestMethod(List<string> ids);

        List<string> TestMethod(List<string> ids, bool testBool);
    }


    public class UnitTest1
    {
        [Fact]
        public void Foo()
        {
            List<string> testReturnData = new List<string>();
            Mock<TestInterface> mockedInterface = new Mock<TestInterface>();
            mockedInterface
                .Setup(d => d.TestMethod(It.IsAny<List<string>>(), true)).Returns(testReturnData);

            List<string> someValidInput = new List<string>();
            var testInterfaceInstance = mockedInterface.Object;
            List<string> returnData = testInterfaceInstance.TestMethod(someValidInput, true);
        }
    }
}

Это использует xUnit кактестовый бегун.

...