What is “Mock You”系列之(四):自定义Mock对象行为 & MockFactory
2010-02-21 17:16
399 查看
何谓Mock对象行为?
由于模拟出的对象终究是用来“糊弄人”的。我们在UnitTest中不一定会将一个对象的所有方法都Mock掉。而且如果一个Mock对象中有还有用接口/抽象类表示的对象,那么我们不一定就要将它们一起Mock掉。Moq为我们提供了自定义配置这些细节规则的办法。
MockBehavior
Moq有个枚举类型MockBehavior,有三个值Strict,Loose,Default。
Strict表示Mock对象在调用一个方法前这个方法必须被Mock掉,否则就会引发MockException。
而Loose与之相反,如果调用没有Mock的方法也不会出错。Default默认为Loose。
具体的设置方法是在new一个Mock<T>的时候。要注意Mock<T>中的Behavior属性是只读的。
DefaultValue
我们再添加一个接口TargetInterfaceTwo用来演示DefaultValue在不同设定下Mock对象的不同行为。代码如下:
这里注意Mock类(一个抽象类)有一个静态方法Get<T>(T mock),如果Mock对象是被自动创建的,我们可以用它来获得这个Mock对象。
MockFactory
通过MockFactory我们可以批量生产我们自定义配置的Mock对象,并通过MockFactory.Verify/VerifyAlll来统一验证。示例如下。
由于模拟出的对象终究是用来“糊弄人”的。我们在UnitTest中不一定会将一个对象的所有方法都Mock掉。而且如果一个Mock对象中有还有用接口/抽象类表示的对象,那么我们不一定就要将它们一起Mock掉。Moq为我们提供了自定义配置这些细节规则的办法。
MockBehavior
Moq有个枚举类型MockBehavior,有三个值Strict,Loose,Default。
Strict表示Mock对象在调用一个方法前这个方法必须被Mock掉,否则就会引发MockException。
而Loose与之相反,如果调用没有Mock的方法也不会出错。Default默认为Loose。
具体的设置方法是在new一个Mock<T>的时候。要注意Mock<T>中的Behavior属性是只读的。
[TestMethod] [ExpectedException(typeof(MockException))] public void MoqTest4() { var mo = new Mock<TargetInterfaceOne>( MockBehavior.Strict/*如果设置为Loose则不会引发异常,当前默认为Loose*/ );//还有要注意的是Mock.Behavior是只读属性,所以只能在构造方法中设置 mo.Object.MethodPure();//在MockBehavior.Strict设置下,一切调用未填充的方法/属性/事件时会抛出异常 } |
我们再添加一个接口TargetInterfaceTwo用来演示DefaultValue在不同设定下Mock对象的不同行为。代码如下:
[TestMethod] [ExpectedException(typeof(NullReferenceException))] public void MoqTest5() { var mo = new Mock<TargetInterfaceTwo> { DefaultValue = DefaultValue.Mock/*如果设置为DefaultValue.Mock就不会引发异常,没有引用的成员会被自动Mock*/ }; mo.Object.one.MethodPure(); /*var inner_mo = Mock.Get(mo.Object.one);Mock.Get可以用于获得其中自动Mock的对象实例,然后再对其进一步操作*/ } public interface TargetInterfaceTwo { TargetInterfaceOne one { get; set; } void Two(); } |
MockFactory
通过MockFactory我们可以批量生产我们自定义配置的Mock对象,并通过MockFactory.Verify/VerifyAlll来统一验证。示例如下。
[TestMethod] public void MoqTest6() { MockFactory mf = new MockFactory(MockBehavior.Loose) { DefaultValue = DefaultValue.Mock }; var mo = mf.Create<TargetInterfaceOne>(); var mo2 = mf.Create<TargetInterfaceOne>(); mo.Setup(p => p.MethodPure()).Verifiable("must be invoked"); mo2.Setup(p => p.MethodPure()); mf.Verify(); } |
相关文章推荐
- What is “Mock You”系列之(二) 参数匹配-It & Match<T>
- JVM系列二:GC策略&内存申请、对象衰老
- javaScript系列之自定义对象(七)
- 【软件测试自动化-QTP系列讲座 49】== 自定义对象强制映射封装类(二) ==
- 解读ASP.NET 5 & MVC6系列(16):自定义View视图文件查找逻辑
- Spring.NET学习笔记11——自定义对象行为(基础篇)
- <Head First Java>学习笔记--第四章:方法操作实例变量 对象的行为
- Lance老师UI系列教程第七课->自定义spinner下拉框实现的实现
- WCF 项目应用连载[5] - 自定义配置 扩展ChannelFactory<T> - LDuplex<T>
- 设定Mock对象的期望行为及返回值
- Android 源码系列之<六>从源码的角度深入理解LayoutInflater.Factory之主题切换(下)
- JVM系列二:GC策略&内存申请、对象衰老
- 【我的Java笔记】增强for循环 & ArrayList集合储存自定义对象并遍历的五种方法
- JVM系列二:GC策略&内存申请、对象衰老
- JVM系列二:GC策略&内存申请、对象衰老
- Silverlight & Blend动画设计系列八:拖放(Drag-Drop)操作与拖放行为(DragBehavior)
- WEBGL 2D游戏引擎研发系列 第五章 <操作显示对象>
- 解读ASP.NET 5 & MVC6系列(16):自定义View视图文件查找逻辑
- JVM系列二:GC策略&内存申请、对象衰老
- JVM系列二:GC策略&内存申请、对象衰老