【问题标题】:MOQ - Returning value that was return by methodMOQ - 通过方法返回的返回值
【发布时间】:2018-04-05 08:05:42
【问题描述】:

我在接口上有一个方法:

string GetUserDetails(string whatever);

我想用 MOQ 模拟它,以便它返回方法返回的任何内容,即用户详细信息 - 类似于:

_mock.Setup( theObject => theObject.GetUserDetails( It.IsAny<string>( ) ) )
   .Returns( [object return by GetUserDetails method] ) ;

有什么想法吗?

【问题讨论】:

  • 您可以做所谓的部分模拟并使用此方法的具体实现,但您肯定最好只模拟返回值吗?而是按照您的示例建议设置您的方法以返回一些任意字符串。模拟的重点是将被测代码与其依赖项隔离开来。
  • 是的,我理解你的意思,但我们需要实际使用从数据库(从存储库)返回的实际数据集,而不是创建我们自己的模拟数据来实现单元测试用例。 s
  • 在这种情况下,您不是在编写单元测试,而是需要编写集成测试。在这种情况下,起订量不是您所需要的。您不想在这条路线上走得更远,在这里使用部分模拟,后果自负。我建议也许阅读测试金字塔以及单元测试和集成测试之间的区别。
  • 是的!我想我需要就此与我的技术负责人谈谈 .. 谢谢!
  • 别担心,好主意,我希望它对你有用

标签: unit-testing mocking nunit moq ninject.web.mvc


【解决方案1】:

对于所描述的情况,您需要使用部分模拟。在 Moq 中有两种不同的方式来实现它:

  1. 在构造时指定 CallBase:var mock = new Mock&lt;MyClass&gt; { CallBase = true };。在这种情况下,默认调用此对象的方法将执行真正的方法实现(如果有)。

  2. 为某些特定方法指定 CallBase:mock.Setup(m =&gt; m.MyMethod()).CallBase();

另见When mocking a class with Moq, how can I CallBase for just specific methods?

【讨论】:

  • 感谢您的回复,但您不认为您的两个语句相同,如果有,此对象方法将执行真正的方法实现。 && 如果您只想为某些特定方法调用基本方法。
  • @mayankgupta 我已经解释了答案,这两种方法不同
猜你喜欢
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多