单元测试——Moq框架下的Mock简介及简单实例

1.为什么要用Mock

在测试过程中,往往会遇到这些问题:

1)真实对象具有不可确定的行为(产生不可预测的结果,如股票行情)。 

2)真实对象很难被创建。 

3)真实对象的某些行为很难触发(如网络错误)。

4)真实对象令程序的运行速度很慢。 

5)真实对象有(或者是)用户界面。 

(6)测试需要询问真实对象它是如何被调用的(例如,测试可能需要验证某个回调函数是否被调用了)。 

(7)真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍问题)。 

借助于mock对象,我们就可以解决上面提到的所有问题。


2.如何使用Mock

1)种种原因,某对象需要暂时用Mock来模拟;

2)使用一个接口来描述这个对象;

3)以测试为目的,在mock对象中实现这个接口。


3.测试准备:

(1)下载安装NUnit,地址:http://download.csdn.net/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
{
    /// 
    /// 幂运算 接口
    /// 
    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 mockObject = new Mock();
                //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



你可能感兴趣的:(单元测试)