NMock学习系列(一)--- 对象及数据库模拟介绍
来源:互联网 发布:新手特效制作软件 编辑:程序博客网 时间:2024/06/07 14:17
介绍
单元测试是对一个系统的最小可测试单元的检查和验证,系统里关键点位的规则、关键的逻辑均可建立一个单元测试,但是对于一些存在不确定行为对象的测试或者数据库操作的测试不确定因素比较高,初期对此建立的单元测试往往在中后期被废弃掉,原因无非是数据库表的改变或者数据改变或者对象结构改变等等诸多不确定因素的影响。所以要想系统地建立一个单元测试并最大化其作用,我们必须先解决对象行为的不确定性。可以考虑通过依赖接口的方式将这些行为模块化地进行隔离,单元测试只需要模拟这些接口然后注入到需要单元测试的类中,这样就可以将不确定的对象与单元测试解耦并无需依赖。NMock的功能就是这样实现的,NMock是通过对接口的属性、方法、事件的模拟,从而实现无需依赖接口实现类即可进行单元测试的效果(原理是运行时通过动态代理的方式创建对象)。
这样看来要想使用NMock进行单元测试的辅助,你的系统必须是面向接口来编程的,也就是说你要测试的类对外部的依赖必须是接口依赖。目前我想到的适合的应用场景有两个:
- MVP架构模式系统对控制器的单元测试的建立。MVP架构模式是以接口的方式将视图层和业务逻辑进行分离,对于系统的开发我们只需要定义视图接口而无需关心其具体实现,你可以写好控制层,并定义了视图接口具体的UI逻辑可以慢慢实现,这时由于没有具体实现,想要进行控制器的单元测试可以借助于NMock来对视图进行模拟。
- DDD领域驱动对于领域层的单元测试的建立。DDD领域驱动实现过程中对于仓储的调用只需在领域层定义一个接口,然后具体实现可无需关心,领域层对于数据的持久化只需依赖仓储接口。当想要对领域层的聚合根等类进行测试时就可以用NMock来对仓储进行模拟。
以上两个是我学习了NMock之后所想到的两个应用场景,也是接下来两篇博客准备具体介绍的。个人认为只要是面向接口方式的编程,单元测试的时候基本上可以使用NMock进行辅助测试。
基础环境搭建
我所使用的NMock是3版本的即NMock3,NMock的官网是:http://nmock3.codeplex.com/ 下载目录如下
可支持Framework4 和Framework3.5,Tutorials是一个教程项目,我使用的是Fx3.5版本的,下载NMock3 Fx 3.5 解压只有一个dll,单元测试的项目引用即可
实例代码
首先学习下一些基本的使用代码,下两篇再学习下两个应用场景的实例。
首先使用必须要先创建基本工厂:
MockFactory _factory = new MockFactory();
Mock<IList> _mock = _factory.CreateMock<IList>();
此时的_mock并不是一个IList对象,_mock.MockObject才是IList的模拟对象(可以说是实现类)
_View.Expects.One.GetProperty(v => v.ID, 1000);其中_View是一个创建的模拟对象具有一个ID属性,访问_View.MockObject.ID时就是1000了。
对于事件的模拟可用如下代码:
_View.Expects.One.EventBinding(v => v.Init += null);
对于方法的模拟可用如下代码:
addressRp.Expects.One .Method(d => d.SaveAddress(null)) .With(adress) .Will(Return.Value(result));
具体的使用方法将在接下来的两篇进行详细的介绍。
0 0
- NMock学习系列(一)--- 对象及数据库模拟介绍
- NMock学习系列(二)--- NMock在MVP架构系统的单元测试中的应用
- NMock学习系列(三)--- NMock在DDD领域驱动的单元测试中的应用
- K2工作流学习系列(一)--- BPM流程介绍及场景
- TestOptimal 系列一:TestOptimal介绍及安装
- MongoDB深入学习系列(一)---开发环境配置及工具介绍
- 使用Nmock单元测试 .NET 业务对象
- XMPP介绍一:服务器及数据库搭建
- C++对象模型学习系列(一)
- SQLServerToSQLite 程序代码的分析翻译及学习(一、SQLServer数据库对象化提取)
- 学习Struts框架系列(一):模拟Struts工作流程
- tensorflow学习一:安装及基本介绍
- oracle owb介绍系列一之简介及使用流程
- [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍
- Redis系列(一)——介绍及安装配置
- Zookeeper系列(一)背景介绍及基本概念
- 增强学习系列之(一):增强学习介绍
- J2EE 与 IBM 对象-关系数据库系列连载一
- nodejs+express中利用中间件提高代码复用
- 创造新语言(1)——确定架构
- 玩转Arduino之开篇
- 4、角色
- 【ZJU】3863 Paths on the Tree 【浙大2015年4月校赛D题】 树分治
- NMock学习系列(一)--- 对象及数据库模拟介绍
- 利用GitHub开源组件PullToRefresh实现上拉下拉弹簧效果
- 解题报告 之 POJ1273 Drainage Ditches
- linux学习:基础知识
- 【Foundation学习笔记】数字对象NSNumber和NSValue
- Objective-C类方法中使用self注意事项
- linux mongodb
- java类的初始化块/执行顺序,实例化对象数据赋值
- 开源中国iOS客户端学习——网络通信AFNetworking类库