1.为什么要用Mock?
在测试过程中,往往会遇到这些问题:
(1)真实对象具有不可确定的行为(产生不可预测的结果,如股票行情)。
(2)真实对象很难被创建。
(3)真实对象的某些行为很难触发(如网络错误)。
(4)真实对象令程序的运行速度很慢。
(5)真实对象有(或者是)用户界面。
(6)测试需要询问真实对象它是如何被调用的(例如,测试可能需要验证某个回调函数是否被调用了)。
(7)真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍问题)。
借助于mock对象,我们就可以解决上面提到的所有问题。
2.如何使用Mock?
(1)种种原因,某对象需要暂时用Mock来模拟;
(2)使用一个接口来描述这个对象;
(3)以测试为目的,在mock对象中实现这个接口。
3.测试准备:
(1)下载安装NUnit,地址:http://download.youkuaiyun.com/detail/wangqingbo0829/8470143
【注】Moq解压后,使用NET35文件中的moq.dll。如果不兼容,可换其他版本(NET40、NET40-RequiresCastle)。
(2)向“测试用例项目”中添加两个引用nunit.framework、moq.dll。
4.测试实例:
(一个类中实现加、减、乘、除 四则运算运算;另一个类中进行幂运算,但尚未实现,而使用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.youkuaiyun.com/wangqingbo0829/article/details/43975243