【问题标题】:Mock a method with parameters模拟带参数的方法
【发布时间】:2012-03-29 17:39:29
【问题描述】:

我正在注入一个依赖项CheckCompatibRepository。我在嘲笑一个方法IsCompatible,它有一个列表作为第三个参数。

 var mockRepositoryCheckCompatib = new Mock<ICheckCompatibilityActDoer>();
            mockRepositoryCheckCompatib.Setup(c => c.IsCompatible(doer, activity, listActivitiesPreDispatched)).Returns(true);

问题在于列表。它由我正在测试的类填充。老实说,我不关心那个参数,我想模拟 IsCompatible 忽略那个参数。那可能吗?

否则,模拟将无法捕获方法调用。为了方便起见,我尝试将列表作为注入的依赖项发送到我的班级中。它一直工作到列表开始被填充,然后模拟停止捕获调用。

你会如何模拟这个?

【问题讨论】:

  • 不是It.IsAny等吗?文档中没有介绍吗?

标签: c# mocking moq


【解决方案1】:

由于您使用的是Moq,因此您正在寻找It.IsAny&lt;T&gt; 方法。由于您要更改列表的值,因此将对象实例传递给它并不是正确的方法,因为您必须不断设置 Mock 来处理新参数。

以下示例将允许模拟接受List&lt;T&gt; 类型的任何参数值。为了这个例子,我们将使用List&lt;int&gt;

 var mockRepositoryCheckCompatib = new Mock<ICheckCompatibilityActDoer>();
 mockRepositoryCheckCompatib.Setup(c => c.IsCompatible(doer, activity, It.IsAny<List<int>>())).Returns(true);

编辑:我之前没有看到 bzlm 的评论,这基本上回答了这个问题。如果他发了,请接受他的回答,我不是故意偷的。

【讨论】:

  • 我的评论是这样的:一个快速的路过笔记,充其量,将 OP 和未来的回答者指向正确的方向,甚至不知道我是否正确。在 SO 上发布答案永远不会被视为偷猎。即使是两个几乎相同的答案也很好——社区将投票决定哪个更好。所以你做了完全正确的事。 :)
猜你喜欢
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 2016-04-07
相关资源
最近更新 更多