mock测试就是在中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.
1 using Moq; 2 3 // Assumptions: 4 5 public interface IFoo 6 { 7 Bar Bar { get; set; } 8 string Name { get; set; } 9 int Value { get; set; }10 bool DoSomething(string value);11 bool DoSomething(int number, string value);12 string DoSomethingStringy(string value);13 bool TryParse(string value, out string outputValue);14 bool Submit(ref Bar bar);15 int GetCount();16 bool Add(int value);17 }18 19 public class Bar 20 {21 public virtual Baz Baz { get; set; }22 public virtual bool Submit() { return false; }23 }24 25 public class Baz26 {27 public virtual string Name { get; set; }28 }
上面给了一个类,接下来演示怎么mock这个类,并且模拟某些方法的返回值
1 var mock = new Mock();2 mock.Setup(foo => foo.DoSomething("ping")).Returns(true);3 4 mock.Setup(foo => foo.DoSomething(It.IsAny (),It.IsAny ())).Returns(true);
第一行Mock出了一个虚拟对象
第二行说明当调用IFoo的DoSomething(string value)方法,且传入参数"ping"的时候,不论DoSomething里面的代码是什么,都会返回true,即直接跳过DoSomething里面的所有代码
第三行说明当调用IFoo的DoSomething(int num,string value)时,不论传入的num和value值为什么,都返回true
能设置方法的返回值,当然也能设置属性的值
1 mock.Setup(foo => foo.Name).Returns("bar");
还有一些神奇的操作,我太懒了不想写,放个代码示例方便查看~~
Callbacks
1 var mock = new Mock();2 var calls = 0;3 var callArgs = new List ();4 5 mock.Setup(foo => foo.DoSomething("ping"))6 .Returns(true)7 .Callback(() => calls++);
Verification
1 mock.Verify(foo => foo.DoSomething("ping"));
miscellaneous
1 var mock = new Mock();2 mock.SetupSequence(f => f.GetCount())3 .Returns(3) // will be returned on 1st invocation4 .Returns(2) // will be returned on 2nd invocation5 .Returns(1) // will be returned on 3rd invocation6 .Returns(0) // will be returned on 4th invocation7 .Throws(new InvalidOperationException());