码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-03-01 00:25:15      阅读:324      评论:0      收藏:0      [点我收藏+]

标签:单元测试   moq框架   nunit   mock对象   

1.为什么要用Mock

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

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

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

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

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

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

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

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

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


2.如何使用Mock

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

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

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


3.测试准备:

(1)下载安装NUnit,地址:

【注】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.csdn.net/wangqingbo0829/article/details/43975243



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

标签:单元测试   moq框架   nunit   mock对象   

原文地址:http://blog.csdn.net/wangqingbo0829/article/details/43991641

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!