第一篇文章, 关于Mock的概念介绍: http://www.javashuo.com/article/p-rjikmmye-ha.htmlhtml
第二篇文章, 关于方法Mock的介绍: http://www.javashuo.com/article/p-bbgioyks-mg.htmlgit
第三篇文章, 关于属性Mock的介绍: http://www.javashuo.com/article/p-vrvqgofk-mh.htmlgithub
第四篇文章, 关于行为Mock的介绍: http://www.javashuo.com/article/p-hwcygjfb-mh.html测试
本文介绍使用Moq其它一些功能.ui
使用的代码: https://github.com/solenovex/Moq4-Tutorial-Code 里面的 05 Before 部分.spa
这里是指让mock对象抛出异常.3d
首先建立一个测试方法, 并设定球员年龄小于16岁时, IPhysicalExamination会在调用IsHealthy()方法时抛出异常:htm
随后在球员审批的方法里, 须要捕获这个异常, 并返回相应的结果:对象
这个测试会经过:blog
上面使用的是泛型的版原本抛出异常, 也能够不使用泛型, 直接抛出异常:
咱们还可让mock对象来引发事件.
首先在IPhysicalExamination添加一个event:
每当IsHealthy()方法被调用后, 就应该引发这个event事件.
在实现类里, 也须要加上这个event, 可是暂时不对它作任何其它动做:
在转会审批类里, 作这样几处修改:
添加一个处理事件的方法, 若是事件被触发, 那么PlayerHealthChecked这个标识就会变成true.
建立一个测试方法, 以判断该event是否被触发:
这个测试应该会失败:
由于该event并无被触发(PhysicalExamination里并没作什么动做).
这时, 咱们可使用mock对象来触发该事件, 在测试方法里, 手动调用mock对象的Raise()方法:
第一个参数是lambda表达式, 该事件绑定到null, 第二个参数针对本例是EventArgs.Empty便可.
再测试, 就会经过:
第二种方法是在设置IsHealthy()方法的时候对事件进行触发设定:
这样的话只要IsHealthy()方法被调用, 那么HealthChecked这个事件也会被触发.
该测试也会经过:
使用SetupSequence()方法能够为mock对象的成员在连续调用的时候每次都返回指定的值(或抛出指定的异常):
该测试执行时, 第一次调用IsHealthy()方法时, 该方法返回true, 体检经过; 而第二次调用IsHealthy()方法时, 返回false, 体检不经过.
这个测试是会经过的:
首先创建一个类, 它没有实现任何接口, 里面有一个方法用于判断当前是否处于转会期:
而后在转会审批类里使用该类:
建立一个测试方法, mock上面的类:
可是该测试回失败:
这是由于Moq在mock这种类的时候要求其方法必须是virtual的.
那么修改该方法为virtual:
这样的话测试就会经过:
为上面的类再添加一个protected virtual 方法:
若是想要mock这个方法的话, 须要这样用:
有参数的话, 须要用到ItExpr类.
咱们能够把以前写的设定代码使用Linq的方式来写:
这里要使用Mock.Of<T>()方法. 参数的lambda表达式里面能够设定mock对象成员的返回值.
因为这种方法直接返回所需的类型, 因此在使用mock对象的时候就无需使用.Object属性了.
该测试也会经过:
Moq的简介就到这里, 其实看官方文档会更快速一些: https://github.com/Moq/moq4/wiki/Quickstart
重构后的代码在: https://github.com/solenovex/Moq4-Tutorial-Code 里面的05 After.