您的位置:首页 > 其它

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

2015-02-28 23:05 483 查看

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
{
    /// <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下载地址:

安装详解:/article/1579904.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: