我的接口定义如下:
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();
});
然后测试运行正常。 :)
答案 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
作为测试运行程序。