单元测试学习系列(一)--- NMock对象及数据库模拟介绍

介绍

        单元测试是对一个系统的最小可测试单元的检查和验证,系统里关键点位的规则、关键的逻辑均可建立一个单元测试,但是对于一些存在不确定行为对象的测试或者数据库操作的测试不确定因素比较高,初期对此建立的单元测试往往在中后期被废弃掉,原因无非是数据库表的改变或者数据改变或者对象结构改变等等诸多不确定因素的影响。所以要想系统地建立一个单元测试并最大化其作用,我们必须先解决对象行为的不确定性。可以考虑通过依赖接口的方式将这些行为模块化地进行隔离,单元测试只需要模拟这些接口然后注入到需要单元测试的类中,这样就可以将不确定的对象与单元测试解耦并无需依赖。NMock的功能就是这样实现的,NMock是通过对接口的属性、方法、事件的模拟,从而实现无需依赖接口实现类即可进行单元测试的效果(原理是运行时通过动态代理的方式创建对象)。
        这样看来要想使用NMock进行单元测试的辅助,你的系统必须是面向接口来编程的,也就是说你要测试的类对外部的依赖必须是接口依赖。目前我想到的适合的应用场景有两个:
  1. MVP架构模式系统对控制器的单元测试的建立。MVP架构模式是以接口的方式将视图层和业务逻辑进行分离,对于系统的开发我们只需要定义视图接口而无需关心其具体实现,你可以写好控制层,并定义了视图接口具体的UI逻辑可以慢慢实现,这时由于没有具体实现,想要进行控制器的单元测试可以借助于NMock来对视图进行模拟。
  2. 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));

具体的使用方法将在接下来的两篇进行详细的介绍。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。