NMock学习系列(二)--- NMock在MVP架构系统的单元测试中的应用

介绍

上篇已经学习了NMock的一些基础概念和代码,同时也想到了可能的两个应用场景,本篇开始学习下第一个应用场景---NMock在MVP架构模式下的应用场景。MVP的架构模式概念比较简单,主要是以接口的形式隔离视图与控制器之间的耦合,具体对于MVP模式的介绍请自行搜索学习。本篇接下来的学习前提是读者了解MVP的架构模式,主要明白视图接口的解耦。

应用场景

基于MVP模式的项目往往业务逻辑的编写和视图的建立是分开进行的,视图只需定义出接口供业务控制器进行依赖调用。所以如果在视图还未具体实现的情况下,我们想要对各个业务控制器进行单元测试的前提必须要模拟出视图接口的行为及属性。这时我们就可以使用NMock来进行辅助测试了。下面开始直接退出代码实例:

首先视图接口定义如下:

        public interface IViewBase
        {
             int ID { get; }
             string Name { get; set; }
	     event EventHandler Init;
        }

控制器定义如下

        public class PresenterBase
	{
		public string Status { get; protected set; }

		public PresenterBase(IViewBase view)
		{
			View = view;

			Status = "Constructed";
		}

		protected IViewBase View{ get; private set;}

		public void BindEventsInternal()
		{
			View.Init += view_Init;
			BindEvents();
		}

		protected virtual void BindEvents()
		{}

		private void view_Init(object sender, EventArgs e)
		{
			Status = "Init";
		}
	}

具体的数据模型我就不定义了,因为这个应用场景中暂时不考虑到模型。

要想建立控制器方法BindEventsInternal的单元测试,我们必须要定义出一个具体实现了接口IViewBase的类,我们就可通过NMock进行模拟,代码如下:

        private MockFactory _factory;

        [TestInitialize]
        public void TestInitialize()
        {
            _factory = new MockFactory();
        }

        [TestMethod]
        public void TestMockMVP()
        {
            Mock<IViewBase> _View = _factory.CreateMock<IViewBase>();

            //设置事件
            _View.Expects.One.EventBinding(v => v.Init += null);    //模拟方法
            //若是泛型则写法如下
            //_View.Expects.One.EventBinding<类型>(v => v.Init += null);
            PresenterBase presenter = new PresenterBase(_View.MockObject);
            Assert.IsNotNull(presenter);
        }

这样模拟出的_View.MockObject相当于一个实现了IViewBase的具体类的实例。

时间: 2024-08-15 12:49:14

NMock学习系列(二)--- NMock在MVP架构系统的单元测试中的应用的相关文章

NMock学习系列(三)--- NMock在DDD领域驱动的单元测试中的应用

介绍 领域驱动设计涵盖的知识点比较多,其中代码的架构.设计.编写基本上只占到其中的很小一部分,其它的大部分讲解的是需求的获取方式.项目的管理方式等知识.本篇就是针对这一小部分的知识点位来展开的.所以本篇的学习前提是只需要了解DDD的架构分层即可. 应用场景 DDD领域驱动设计中一旦领域驱动层模型建立完毕,就会产生出数据库持久化的接口即仓储的接口供其它层来做具体实现,所以要想建立领域层的单元测试,就必须实现这些仓储接口或者模拟出这些接口实现.我们可以采用NMock来进行模拟仓储的实现.下面开始学习

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

MyBatis系列二 之 数据库列名于程序实体类中字段名称不一致

MyBatis系列二  之   数据库列名于程序实体类中字段名称不一致 情景:当数据库中的列名与我们程序实体类中的字段名称不一致         使用ResultMap节点配置信息  在映射文件中  mapper根节点下配置ResultMap节点信息 <resultMap type="Student" id="studentMapper"> <result column="sname" property="stunam

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

介绍 单元测试是对一个系统的最小可测试单元的检查和验证,系统里关键点位的规则.关键的逻辑均可建立一个单元测试,但是对于一些存在不确定行为对象的测试或者数据库操作的测试不确定因素比较高,初期对此建立的单元测试往往在中后期被废弃掉,原因无非是数据库表的改变或者数据改变或者对象结构改变等等诸多不确定因素的影响.所以要想系统地建立一个单元测试并最大化其作用,我们必须先解决对象行为的不确定性.可以考虑通过依赖接口的方式将这些行为模块化地进行隔离,单元测试只需要模拟这些接口然后注入到需要单元测试的类中,这样

ASP.NET MVC学习系列(二)-WebAPI请求(转)

转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax

Java学习系列(二十四)Java正则表达式详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45501777 前言 正则表达式可以说是用来处理字符串的一把利器,它是一个专门匹配n个字符串的字符串模板,本质是查找和替换.在实例演示之前先了解一下Pattern.Matcher这两个工具类,Pattern:编译好的带匹配的模板(如:Pattern.compile("[a-z]{2}");/ / 取2个小写字母):Matcher:匹配目标字符串后产生的结果(如:pattern.m

Java I/O系统学习系列二:输入和输出

编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇文章:<<Java I/O系统学习系列一:File和RandomAccessFile>>中,我们讲到RandomAccessFile可以写入和读取文件,具备I/O功能,但是其只能针对文件,而I/O还涉及到很多其他场景比如网络.读取内存中的字符串等,所以Java类库中提供了一系列的类库来对其进行支持,也就是

Canvas学习系列二:Canvas的坐标系统

上一章内容中我们对canvas元素有了一个初步的认识,在接下来的章节中我们会慢慢学习canvas中图形的绘制:但是在绘制之前我们先来看看canvas中的坐标系统,因为这样我们才能知道绘制的图形放在什么位置. 比如:我们要在canvas画布的(100,100)这个位置绘制一个圆 看到这个要求顿时就懵逼了,(100, 100)在什么地方!!! 至于为什么会懵逼呢?是因为我们不知道canvas的坐标系统,那么我们就赶紧来了解Canvas中的坐标系统吧 在了解canvas坐标系统之前,我们先来看看其他的

Java学习系列(二十一)Java面向对象之注解详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45295947 一.前言 Java中的注解Annotation运用到很多方面,比如之前讲的单元测试中的@Test.Spring.SpringMVC还有其他框架等等.Java本身自带的注解也有一些,比如:@Override(子类要重写/覆写父类的对应方法).@Deprecated(表示方法不建议被使用).@SuppressWarnings(抑制警告)等等.当然,我们也可以自定义一些自己需要的