返回传递给方法的值


390

我在接口上有一个方法:

string DoSomething(string whatever);

我想用最小起订量来模拟它,以便它返回传入的内容-类似于:

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

有任何想法吗?

Answers:


525

您可以将lambda与输入参数一起使用,如下所示:

.Returns((string myval) => { return myval; });

或者更具可读性:

.Returns<string>(x => x);

1
在您需要为具有7个参数的方法执行此操作之前,这似乎很容易。当我IReturns在Moq中检查时,它最多Returns4个参数定义。有什么简单的方法可以解决这个问题?/我的意思是,除了修改Moq来源之外//
mizuki nakeshu 2013年

14
好的,它在v中最多定义了9个参数。解决了:)Moq4.0.0.0
mizuki nakeshu 2013年

14
@mizukinakeshu我会考虑对9参数方法进行一些重构,因为听起来好像类/方法做得太多。也许将9个参数重构到设置类或结构中,以在以后帮助您?
参议员

@TheSenator同意,我不知道这是什么意思,但是我想我只是在为我不愿修改的已有代码一起破解一些单元测试,否则肯定需要重构这些参数。
mizuki nakeshu 2015年

27
只是一个提示,这让我感到困惑:字符串中的内容.Returns<string>是指输入参数,而不是您要返回的值。
2015年

241

更有用的是,如果您有多个参数,则可以使用以下命令访问其中的任何一个/全部:

_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));

您始终需要引用所有参数,以匹配方法的签名,即使您仅使用其中之一。


17
这应该是公认的答案。这正是您需要做的。其他任何情况都将引发“预期参数数量”异常。
Chaim Eliyah 2015年

是的,绝对易于阅读并且可以使用ReturnsAsync
皮奥特·库拉

1
这个答案挽救了一天。注意(将来的读者),您也可以进一步介绍它。.returns((字符串a,字符串b,字符串c)=> {字符串d =“哇”;返回string.Concat(a,b,c,d);}));
granadaCoder

1
就个人而言,这是一个更好的答案。我对Moq的了解很少,但我仍然立即了解。
unrealsoul007

对于返回void的方法,我使用.Callback((string a,Exception b,string c)=> throw new Exception(b.Message));
tymtam

62

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

_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);

或者,如果该方法需要多个输入,则像这样指定它们:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.