日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

.NET使用Moq進行單元測試_實用技巧

作者:Darren?Ji ? 更新時間: 2022-10-09 編程語言

本篇體驗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的實例

模擬方法后執(zhí)行回調(diào)函數(shù)

   [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
            }
        }
    }
  • 執(zhí)行Return方法后,執(zhí)行Callback回調(diào)方法,接收的參數(shù)類型是委托

模擬方法依次返回多個值

    [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);

結(jié)果,測試不通過。因為SutupSequence返回方法返回值的時候是有順序的。

模擬第二次調(diào)用方法返回異常

    [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方法,在第二次調(diào)用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);
        }
    }

在被模擬的HelperClass類中,IsEnabled方法內(nèi)部拋出異常。當(dāng)把Moq實例的CallBase屬性設(shè)置為true,并調(diào)用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);
        }
    } 

原文鏈接:https://www.cnblogs.com/darrenji/p/3869602.html

欄目分類
最近更新