无故获得“参数计数不匹配”

时间:2019-10-14 19:44:32

标签: c# mocking moq

我的接口定义如下:

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 个答案:

答案 0 :(得分:1)

我认为您的代码示例缺少一些内容。您是从模拟中获得.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作为测试运行程序。