介绍
上篇已经学习了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的具体类的实例。