在测试过程中,往往会遇到这些问题:
(1)真实对象具有不可确定的行为(产生不可预测的结果,如股票行情)。
(2)真实对象很难被创建。
(3)真实对象的某些行为很难触发(如网络错误)。
(4)真实对象令程序的运行速度很慢。
(5)真实对象有(或者是)用户界面。
(6)测试需要询问真实对象它是如何被调用的(例如,测试可能需要验证某个回调函数是否被调用了)。
(7)真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍问题)。
借助于mock对象,我们就可以解决上面提到的所有问题。
(1)种种原因,某对象需要暂时用Mock来模拟;
(2)使用一个接口来描述这个对象;
(3)以测试为目的,在mock对象中实现这个接口。
(1)下载安装NUnit,地址:
【注】Moq解压后,使用NET35文件中的moq.dll。如果不兼容,可换其他版本(NET40、NET40-RequiresCastle)。
(2)向“测试用例项目”中添加两个引用nunit.framework、moq.dll。
(一个类中实现加、减、乘、除 四则运算运算;另一个类中进行幂运算,但尚未实现,而使用Mock进行替代。)
(1) 源程序 程序中有一个方法(PowerfunctionAction)需要用Mock模拟
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CountFunction { public class Methods { //控制台应用程序,程序入口 static void Main(string[] args) { } //声明接口 private IPowerfunction _actionNum; //无参构造函数 public Methods(){ } //构造函数 public Methods(IPowerfunction actionNum) { //属性 初始化(通过传参 接口 成为 属性成员) this._actionNum = actionNum; } //幂运算(指数为整数) public double PowerfunctionAction(double a, int num) { //通过 成员函数 调用接口 ,其依赖于其他接口实现(假使尚未完成开发) return this._actionNum.PowerfunctionGetValue(a,num); } //……其他函数(方法)实现 #endregion } }
(2) 特殊接口(专为“需要用Mock模拟的方法”写的接口)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CountFunction { /// <summary> /// 幂运算 接口 /// </summary> public interface Ipowerfunction //专为 需用mock替代的对象 写一个接口 { double PowerfunctionGetValue(double a ,int num); } }(3) 测试项目
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NUnit.Framework; using CountFunction; using Moq; namespace CountFunction.Tests { [TestFixture] public class ProgramTester { #region 使用Mock的进行测试 //1. Mock代替 接口IPowerfunction(即 Mock = IPowerfunction) private IPowerfunction prvGetMockPowerFunction() { //1.1 声明 泛型的Mock对象(mock = IPowerfunction) Mock<IPowerfunction> mockObject = new Mock<IPowerfunction>(); //1.2 设置Mock返回值——具体代表的内容 mockObject.Setup(m => m.PowerfunctionGetValue(2, 3)).Returns(8); //1.3 返回Mock对象(用途替代) return mockObject.Object; } //2. 调用Mock [Test(Description = "幂运算Powerfunction()的测试")] public void TestPowerfunction() { //2.1 调用私有函数成员, 产生代替接口的mock(此 IPowerfunction = Mock) IPowerfunction powFun = this.prvGetMockPowerFunction(); //2.2 实例化 出使用mock进行替代后的 对象 Methods methods = new Methods(powFun); //2.3 为综合接口传值、调用 double result = methods.PowerfunctionAction(2, 3); //2.4 设置断言,判断 Assert.AreEqual(8, result); } //……对其他函数(方法)的测试 #endregion } }
NUnit、Moq下载地址:
安装详解:http://blog.csdn.net/wangqingbo0829/article/details/43975243
原文:http://blog.csdn.net/wangqingbo0829/article/details/43991641