Moq +单元测试- System.Reflection.TargetParameterCountException:参
本文关键字:TargetParameterCountException Reflection System 单元测试 Moq | 更新日期: 2023-09-27 18:10:48
我试图使用一个多参数函数的lambda,但是当我试图调用mock.Object.Convert(value, null, null, null);
行时,Moq在运行时抛出此异常。
代码是:
var mock = new Mock<IValueConverter>();
mock.Setup(conv => conv.Convert(It.IsAny<Object>(), It.IsAny<Type>(),
It.IsAny<Object>(), It.IsAny<CultureInfo>())).Returns((Int32 num) => num + 5);
var value = 5;
var expected = 10;
var actual = mock.Object.Convert(value, null, null, null);
实现它的正确方法是什么?
这是你的Returns
条款。你有一个4个参数的方法,但是你只用了1个参数。我运行了以下命令,没有问题:
[TestMethod]
public void IValueConverter()
{
var myStub = new Mock<IValueConverter>();
myStub.Setup(conv => conv.Convert(It.IsAny<object>(), It.IsAny<Type>(), It.IsAny<object>(), It.IsAny<CultureInfo>())).
Returns((object one, Type two, object three, CultureInfo four) => (int)one + 5);
var value = 5;
var expected = 10;
var actual = myStub.Object.Convert(value, null, null, null);
Assert.AreEqual<int>(expected, (int) actual);
}
无异常,测试通过
不是OP的答案,但可能对未来的谷歌用户:
我有一个Callback
与正在设置的方法的签名不匹配
Mock
.Setup(r => r.GetNextCustomerNumber(It.IsAny<int>()))
.Returns(AccountCounter++)
.Callback<string, int>(badStringParam, leadingDigit =>
{
// Doing stuff here, note that the 'GetNextCustomerNumber' signature is a single int
// but the callback unreasonably expects an additional string parameter.
});
这是一些重构的结果,重构工具当然不能意识到Callback
签名是不正确的
也许是因为你正在通过null
,但It.IsAny<Object>()
期待除null
以外的任何object
?如果您执行以下操作会发生什么?:
var actual = mock.Object.Convert(value, new object(), typeof(object), CultureInfo.CurrentCulture);
这只是我瞎猜的,我更熟悉Rhino.Mocks。
我的第二个猜测:
看了Moq。下载时附带的CHM,
您正在使用Setup(Expression<Action<T>>)
方法,该方法"为调用void
方法指定模拟类型上的设置"。
您希望Setup<TResult>(Expression<Func<T,TResult>>)
方法"为调用值返回方法指定模拟类型上的设置"。
所以你可以试试:
mock.Setup<Int32>(
conv => {
conv.Convert(
It.IsAny<Object>(),
It.IsAny<Type>(),
It.IsAny<Object>(),
It.IsAny<CultureInfo>());
return num + 5;
});
在我的例子中,我认为Returns<>
中的类型是输出类型,但实际上它是输入类型。
如果你有一个方法
public virtual string Foo(int a, int b) { ... }
正确的子句是.Returns<int, int>(...)
,而不是.Returns<string>(...)
,这是我最初的想法。
我的错误是因为我最初测试的函数具有相同的输入和返回类型-例如public virtual string Foo(string a)
。