我一直在c#中使用Moq框架来进行单元测试中的模拟,但有一件事我还不完全理解。我有这行代码
var feedParserMock = new Mock<ApplicationServices.IFeedParser>();
feedParserMock.Setup(y => y.ParseFeed(csv)).Returns(items).Verifiable();
第二行是否意味着只有传递的参数相同才会返回值?因为我在控制器内部传递给ParseFeed的参数是在控制器内构建的,我在单元测试中无法访问它。目前该方法返回null,有没有办法指定我想返回我的items变量,无论参数是什么?
答案 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();