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

ryu*_*ice 3 c# moq mocking asp.net-mvc-2

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

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

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

dri*_*iis 7

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

feedParserMock.Setup(y => y.ParseFeed(It.IsAny<string>())).Returns(items).Verifiable();
Run Code Online (Sandbox Code Playgroud)

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

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

feedParserMock.Setup(y => y.ParseFeed(It.Is<string>(s => s.Length > 3));
Run Code Online (Sandbox Code Playgroud)

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

查看Moq快速入门指南的"匹配参数"部分以了解更多信息.