关于模拟和moq框架的新手问题

时间:2010-10-02 16:07:16

标签: c# asp.net-mvc-2 mocking moq

我一直在c#中使用Moq框架来进行单元测试中的模拟,但有一件事我还不完全理解。我有这行代码

var feedParserMock = new Mock<ApplicationServices.IFeedParser>();
feedParserMock.Setup(y => y.ParseFeed(csv)).Returns(items).Verifiable();

第二行是否意味着只有传递的参数相同才会返回值?因为我在控制器内部传递给ParseFeed的参数是在控制器内构建的,我在单元测试中无法访问它。目前该方法返回null,有没有办法指定我想返回我的items变量,无论参数是什么?

2 个答案:

答案 0 :(得分:7)

是。 Moq提供It静态类,该类具有用于指定满足特定条件的参数的辅助方法。你的例子可能是:

feedParserMock.Setup(y => y.ParseFeed(It.IsAny<string>())).Returns(items).Verifiable();

然后Moq将匹配您的设置,假设参数是指定类型且非null(我在这里选择字符串,您当然应该使用正确的参数类型替换它以便编译代码) 。

您还可以传递Moq将评估的委托,以确定设置是否匹配。例如:

feedParserMock.Setup(y => y.ParseFeed(It.Is<string>(s => s.Length > 3));

这将匹配ParseFeed上的任何方法调用,其中参数是长度大于3的字符串。

查看Moq Quickstart guide的“匹配参数”部分,了解详情。

答案 1 :(得分:2)

是的,您可以使用It.IsAny()

例如

feedParserMock.Setup(y => y.ParseFeed(It.IsAny<string>())).Returns(items).Verifiable();