返回传递给方法的值

Ste*_*unn 352 c# moq mocking

我在接口上有一个方法:

string DoSomething(string whatever);
Run Code Online (Sandbox Code Playgroud)

我想用MOQ模拟这个,以便它返回传入的内容 - 类似于:

_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
   .Returns( [the parameter that was passed] ) ;
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

mha*_*rah 471

您可以使用带有输入参数的lambda,如下所示:

.Returns((string myval) => { return myval; });
Run Code Online (Sandbox Code Playgroud)

或者稍微更具可读性:

.Returns<string>(x => x);
Run Code Online (Sandbox Code Playgroud)

  • 只是注意,因为这让我很困惑:`.Returns <string>`中的字符串是指输入参数,而不是您要返回的值. (20认同)
  • 好吧,它在`Moq` v`4.0.0.0`中定义了最多**9个参数**.解决了 :) (13认同)
  • @mizukinakeshu我会考虑对9参数方法进行一些重构,因为它听起来像类/方法做得太多了.也许将9个参数重构为设置类或结构以便以后帮助您? (12认同)
  • 甚至更可读`.Returns((string x)=> x);` (9认同)

Ste*_*eve 222

更有用的是,如果你有多个参数,你可以访问任何/所有参数:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>())
     .Returns((string a, string b, string c) => string.Concat(a,b,c));
Run Code Online (Sandbox Code Playgroud)

您始终需要引用所有参数,以匹配方法的签名,即使您只是使用其中一个.

  • 这应该是公认的答案.这正是您需要做的.任何其他东西抛出"预期参数的数量"例外. (17认同)
  • 这个答案挽救了这一天。请注意(未来的读者),您也可以更进一步。.Returns((字符串 a, 字符串 b, 字符串 c) =&gt; { 字符串 d = "wow"; return string.Concat(a,b,c,d); } ); (2认同)
  • 对于返回 void 的方法,我使用 .Callback((string a, Exception b, string c) =&gt; throw new Exception(b.Message)); (2认同)

WDu*_*ffy 58

通用Returns<T>方法可以很好地处理这种情况.

_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);
Run Code Online (Sandbox Code Playgroud)

或者,如果方法需要多个输入,请指定它们,如下所示:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
Run Code Online (Sandbox Code Playgroud)