我正在学习测试驱动开发并尝试使用Moq库进行模拟。 Mock类的Setup方法的目的是什么?
答案 0 :(得分:42)
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)
。
答案 1 :(得分:9)
Setup方法用于设置模拟对象的期望值 例如:
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
在这里,您要在模拟对象上设置DoSomething
方法。你说,当参数为“ping”时,该方法返回true。
现在,根据您的使用情况,此对象可以进一步充当模拟或存根。如果要在基于状态的测试中使用它,它可以充当存根。如果要在基于行为的测试中使用它,它可以充当模拟。在行为测试中,您将在模拟对象上调用verify方法以声明该方法是使用“ping”参数调用的
进一步参考这些链接: