• Moq的一些基本用法


    本篇体验Moq的一些基本用法。首先通过NuGet安装Moq。包括:

      模拟方法的返回值

        public class HelperClass
    
        {
    
            public virtual Boolean IsEnabled()
    
            {
    
                throw new Exception();
    
            }
    
        }
    
        [TestClass]
    
        public class UnitTest1
    
        {
    
            [TestMethod]
    
            public void TestMethod1()
    
            {
    
                var mock = new Mock<HelperClass>();
    
                mock.Setup(x => x.IsEnabled()).Returns(true);
    
                Assert.AreEqual(mock.Object.IsEnabled(),true);
    
            }
    
        }

    ● Moq模拟的方法一般是virtual虚方法,接口方法
    ● mock.Object是指HelperClass的实例

      模拟方法后执行回调函数

       [TestClass]
    
        public class UnitTest1
    
        {
    
            [TestMethod]
    
            public void TestMethod1()
    
            {
    
                string temp = "";
    
                var mock = new Mock<HelperClass>();
    
                mock.Setup(x => x.IsEnabled()).Returns(true).Callback(() => { temp = "success"; });
    
                Assert.AreEqual(mock.Object.IsEnabled(),true);
    
                if (temp == "success")
    
                {
    
                    //TODO
    
                }
    
            }
    
        }

    ● 执行Return方法后,执行Callback回调方法,接收的参数类型是委托

      模拟方法依次返回多个值

        [TestClass]
    
        public class UnitTest1
    
        {
    
            [TestMethod]
    
            public void TestMethod1()
    
            {
    
                var mock = new Mock<HelperClass>();
    
                mock.SetupSequence(x => x.IsEnabled())
    
                    .Returns(true)
    
                    .Returns(false);
    
                
    
                Assert.AreEqual(mock.Object.IsEnabled(),true);
    
                Assert.AreEqual(mock.Object.IsEnabled(), false);
    
            }
    
        }

    ● SetupSequence方法可以为方法返回多个值

    如果把以下2句:

    Assert.AreEqual(mock.Object.IsEnabled(),true);
    Assert.AreEqual(mock.Object.IsEnabled(), false);

    颠倒一下顺序,变成:

    Assert.AreEqual(mock.Object.IsEnabled(), false);
    Assert.AreEqual(mock.Object.IsEnabled(),true);

    结果,测试不通过。因为SutupSequence返回方法返回值的时候是有顺序的。

      模拟第二次调用方法返回异常

        [TestClass]
    
        public class UnitTest1
    
        {
    
            [TestMethod]
    
            public void TestMethod1()
    
            {
    
                var mock = new Mock<HelperClass>();
    
                mock.SetupSequence(x => x.IsEnabled())
    
                    .Returns(true)
    
                    .Throws(new Exception());
    
                
    
                Assert.AreEqual(mock.Object.IsEnabled(),true);
    
                Assert.AreEqual(mock.Object.IsEnabled(), true);
    
            }
    
        }

    ● 通过Throws方法,在第二次调用IsEnable()方法时抛出异常。

      直接返回被模拟方法的原始返回值

        public class HelperClass
    
        {
    
            public virtual Boolean IsEnabled()
    
            {
    
                throw new Exception();
    
            }
    
        }
    
        [TestClass]
    
        public class UnitTest1
    
        {
    
            [TestMethod]
    
            public void TestMethod1()
    
            {
    
                var mock = new Mock<HelperClass>();
    
                mock.CallBase = true;
    
                mock.SetupSequence(x => x.IsEnabled())
    
                    .CallBase();
    
                Assert.AreEqual(mock.Object.IsEnabled(), true);
    
            }
    
        }
    

    1

    在被模拟的HelperClass类中,IsEnabled方法内部抛出异常。当把Moq实例的CallBase属性设置为true,并调用CallBase方法,可在测试方法中直接返回被模拟类中方法的原始返回值。

      模拟泛型类

        public class HelperClass<T> where T : class 
    
        {
    
            public virtual Boolean IsEnabled()
    
            {
    
                throw new Exception();
    
            }
    
        }
    
        public class Sample{}
    
        [TestClass]
    
        public class UnitTest1
    
        {
    
            [TestMethod]
    
            public void TestMethod1()
    
            {
    
                var mock = new Mock<HelperClass<Sample>>();
    
                mock.SetupSequence(x => x.IsEnabled()).Returns(true);
    
                Assert.AreEqual(mock.Object.IsEnabled(), true);
    
            }
    
        }    
    
  • 相关阅读:
    PS教程1000例
    [LeetCode] Ransom Note 赎金条
    Android LinkedList和ArrayList的区别
    Android 一种非常好用的Android屏幕适配
    Android MVC模式和MVP模式的区别
    Android 性能优化的方面方面都在这儿
    Android 高级面试题及答案
    Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)
    android studio 3.0 以上 查看sharedpreference
    Android adb命令查看sharedpreferences
  • 原文地址:https://www.cnblogs.com/darrenji/p/3869602.html
Copyright © 2020-2023  润新知