[UnitTest03]-Moq

来源:互联网 发布:农产品追溯系统源码 编辑:程序博客网 时间:2024/06/05 09:44

       Moq是利用诸如Linq表达式树和Lambda表达式等·NET 3.5的特性,为·NET设计和开发的Mocking库。Mocking以一种自然的方式与现有单元测试进行集成,使它更加简单、直观,以避免开发人员被迫重写测试或学习需要大量录制/播放的Mock框架。Moq的目标就是为了帮助那些编写测试代码,但却不使用Mocking框架的开发人员。Moq的设计原则就是以极低的门槛来获取良好的重构能力。

       Moq之所以出现是因为在实际的单元测试过程中,我们会遇到以下的一些情形:

       1)数据库交互的单元测试。相对规范的软件开发流程是根据详细需求写单元测试,这时候很有可能数据库的模型尚未完成建立或者已经建立,但是测试数据并未加载,我们写单元测试,如果要真的跟数据库进行交互的话,肯定是有问题的,Moq的虚拟对象可以解决这个问题。

       2)复杂的对象交互。当对象的依赖关系比较复杂时,为了构造一个目标对象需要先构造很多的其依赖的对象,这时候就需要写很多的代码,为了简化这些代码,让开发者更加专注于业务逻辑,Moq支持一个虚拟对象,虚拟对象通过依赖注入可以模拟对象的交互关系。

       3)特定情形的测试。比如网络突然断开的情形下进行测试,大批量用户访问数据库等情形的测试。

       下面我们就通过Moq的例子来演示下Moq用法。

接口

       public interface IMoqTest
       {
        int Div(int x, int y);

        void setValue();
       }

       类

       public class MoqTest : IMoqTest
    {
        /// <summary>
        /// 算术除法
        /// 注:这里使用除法做演示是为了方便后面演示if...else分支的UnitTest
        /// </summary>
        /// <param name="x">被除数</param>
        /// <param name="y">除数</param>
        /// <returns>商</returns>
        public int Div(int x,int y)
        {
            if (y == 0)
                return int.MaxValue;
            else
                return x / y;
        }

        public void setValue()
        {
            
        }
    }

    单元测试代码如下:

    [TestClass]
    public class MoqExampleUnitTest
    {
        [TestMethod]
        public void TestDiv_IfYIsNotZero()
        {
            int a = 8;
            int b = 4;
            int expected = 2;

            var moqTest = new Mock<IMoqTest>();
            moqTest.Setup(x => x.Div(a, b)).Returns(expected);
            int actual = moqTest.Object.Div(a, b);

            Assert.AreEqual(expected, actual);
        }

        [TestMethod]
        public void TestDiv_IfYIsZero()
        {
            int a = 8;
            int b = 0;
            int expected = int.MaxValue;

            var moqTest = new Mock<IMoqTest>();
            moqTest.Setup(x => x.Div(a, b)).Returns(expected);
            int actual = moqTest.Object.Div(a, b);

            Assert.AreEqual(expected, actual);
        }

        [TestMethod]
        public void TestSetValue()
        {
            var moqTest = new Mock<IMoqTest>();
            moqTest.Setup(x => x.setValue());
            moqTest.Object.setValue();
            moqTest.Verify(x => x.setValue());
        }
    }

    这里的Moq还是很基础的,下章节会介绍更为深入的Moq使用。

0 0