mec*_*krt 34 tdd unit-testing moq mocking
我正在学习测试驱动开发并尝试使用Moq库进行模拟.Mock类的Setup方法的目的是什么?
Igo*_*aka 44
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
));
Run Code Online (Sandbox Code Playgroud)
上面的设置将匹配对方法的调用Sum
,其值为3 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);
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
上面的代码验证了Sum
两次调用.一次,(7,3)
一次(5,3)
.
P.K*_*P.K 11
Setup方法用于设置模拟对象的期望值例如:
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
Run Code Online (Sandbox Code Playgroud)
在这里,您将DoSomething
在模拟对象上设置方法.您说,当参数为"ping"时,该方法返回true.
现在,此对象可以进一步充当模拟或存根,具体取决于您的用法.如果要在基于状态的测试中使用它,它可以充当存根.如果要在基于行为的测试中使用它,它可以充当模拟.在行为测试中,您将在模拟对象上调用verify方法以声明该方法是使用"ping"参数调用的
进一步参考这些链接:
http://martinfowler.com/articles/mocksArentStubs.html
http://code.google.com/p/moq/wiki/QuickStart