模拟对象设置可以返回两个想要的结果吗?

时间:2014-06-12 18:34:26

标签: c# unit-testing mocking moq

可以使用模拟对象返回多个所需的结果,如下所示吗?

mockObject.Setup(o => o.foo(It.IsAny<List<string>>())).Returns(fooBall);
mockObject.Setup(o => o.foo(It.IsAny<int>())).Returns(fooSquare);

2 个答案:

答案 0 :(得分:3)

是的,您可以使用这些设置。因此foo方法调用的参数是不同的(任何整数和任何字符串列表),这里有两个不同的设置,每个设置都有自己的返回值。如果你有相同的参数,那么最后的设置将取代之前的设置。

请记住 - 每个设置都是由您调用的成员和您传递的参数定义的。

答案 1 :(得分:2)

在您的示例中,因为两个foo方法采用不同的参数类型,它们是重载,而且正如Sergey所说,这些被认为是编译器和Moq完全独立的方法。

在您希望为相同方法返回不同结果的特定情况下,根据输入的值,您可以将It.Is<>与谓词匹配器一起使用来指定过滤器要应用于参数。从最通用到最具体的定义这些,例如,只关注o.foo(int)重载:

mockObject.Setup(o => o.foo(It.IsAny<int>())).Returns(defaultFoo);
mockObject.Setup(o => o.foo(It.Is<int>(i => i == 5))).Returns(fooBall);
mockObject.Setup(o => o.foo(It.Is<int>(i => i > 50 && i % 2 == 0)))
   .Returns(fooSquare);