【发布时间】:2011-03-11 21:58:55
【问题描述】:
我正在学习测试驱动开发并尝试使用 Moq 库进行模拟。 Mock类的Setup方法的作用是什么?
【问题讨论】:
标签: unit-testing tdd mocking moq
我正在学习测试驱动开发并尝试使用 Moq 库进行模拟。 Mock类的Setup方法的作用是什么?
【问题讨论】:
标签: unit-testing tdd mocking moq
Moq Mock 对象的默认行为是存根所有方法和属性。这意味着使用任何参数对该方法/属性的调用都不会失败,并将返回特定返回类型的默认值。
您出于以下任何或所有原因调用Setup 方法:
public interface ICalculator {
int Sum(int val1, val2);
}
var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
It.IsAny<int>(), //Any value
3 //value of 3
));
上述设置将匹配对方法 Sum 的调用,val1 和 val2 的任何值都为 3。
ICalculator 示例,无论输入参数如何,以下设置都将返回值 10:var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
It.IsAny<int>(), //Any value
It.IsAny<int>() //Any value
)).Returns(10);
Mock<T>.VerifyAll() 来验证所有之前的设置是否已被调用(一次)。var mock = new Mock<ICalculator>();
mock.Setup(m=>m.Sum(
7, //value of 7
3 //value of 3
));
mock.Setup(m=>m.Sum(
5, //value of 5
3 //value of 3
));
mock.VerifyAll();
上面的代码验证Sum被调用了两次。一次是(7,3),一次是(5,3)。
【讨论】:
Setup 方法用于设置对 mock 对象的期望 例如:
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
在这里,您正在模拟对象上设置DoSomething 方法。你是说,当参数为“ping”时,方法返回true。
现在,此对象可以进一步充当模拟或存根,具体取决于您的使用情况。如果您想在基于状态的测试中使用它,它可以充当存根。如果您想在基于行为的测试中使用它,它可以充当模拟。在行为测试中,你会调用 mock 对象的 verify 方法来断言该方法是用“ping”参数调用的
进一步参考这些链接:
【讨论】: