模拟一个带参数的方法

问题描述:

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

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

问题是该列表。它由我正在测试的课程填充。我真的很关心这个参数,我想模拟IsCompatible忽略那个参数。那可能吗?

否则,嘲笑只是不会捕捉方法调用。为了缓解这些问题,我尝试了将这个列表作为我的类中的注入依赖项。它一直运行,直到列表开始填充,然后模拟停止捕获电话。

你会怎样嘲笑这件事?

+4

是不是'It.IsAny'等?这不在文档中涵盖了吗? – bzlm 2012-03-29 17:48:38

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

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

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

编辑:我没有看到bzlm的评论,从根本上回答了这个问题。如果他发布了一个,请接受他的回答,我不是故意要挖。

+5

我的评论就是这样的:一个快速开车的笔记最多指出OP和未来的回答者朝着正确的方向,甚至不知道我是否正确。在SO上发布答案永远不会被视为偷猎。即使两个几乎完全相同的答案也完全没问题 - 社区会投票选择哪一个更好。所以你做了正确的事情。 :) – bzlm 2012-03-30 14:59:02