Moq +unit testing – System.Reflection.TargetParameterCountException:参数计数不匹配

我打算使用带有多参数函数的lambdaexpression式,但是当我尝试调用mock.Object.Convert(value, null, null, null);时,Moq会在运行时抛出这个exceptionmock.Object.Convert(value, null, null, null); 线。

  System.Reflection.TargetParameterCountException:参数计数不匹配 

代码是:

 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参数lambda。 我跑了以下没有问题:

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

没有例外,testing通过。

不是一个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签名是不正确的

也许这是因为你传递nullIt.IsAny<Object>()期望除了null之外的任何object ? 如果你做以下事情会发生什么?

 var actual = mock.Object.Convert(value, new object(), typeof(object), CultureInfo.CurrentCulture); 

这只是我在黑暗中刺伤,我更熟悉Rhino.Mocks。


我的第二个猜测:

看了下载的Moq.chm后,

您正在使用Setup(Expression<Action<T>>)方法,其中“指定对虚拟方法调用的模拟types的设置”。

你想要“ Setup<TResult>(Expression<Func<T,TResult>>)方法,”指定一个设置模拟types的调用返回值的方法“。

所以你可以尝试:

 mock.Setup<Int32>( conv => { conv.Convert( It.IsAny<Object>(), It.IsAny<Type>(), It.IsAny<Object>(), It.IsAny<CultureInfo>()); return num + 5; }); 

在我的情况下,我认为Returns<>types是输出types,但实际上它是inputtypes。

所以,如果你有一个方法

 public virtual string Foo(int a, int b) { ... } 

正确的子句是.Returns<int, int>(...) ,NOT .Returns<string>(...)这是我最初想的。

我的错误是因为我最初testing了一个具有相同input和返回types的函数 – 例如public virtual string Foo(string a)