.NET使用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的實例
模擬方法后執(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); } }
到此這篇關(guān)于.NET使用Moq進行單元測試的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET在MVC中MaxLength特性設(shè)置無效的解決方法
這篇文章主要介紹了ASP.NET在MVC中MaxLength特性設(shè)置無效的解決方法,涉及對MVC中表單元素屬性的應(yīng)用技巧,需要的朋友可以參考下2014-11-11asp.net 使用js分頁實現(xiàn)異步加載數(shù)據(jù)
這篇文章主要介紹了asp.net使用js分頁實現(xiàn)異步加載數(shù)據(jù),需要的朋友可以參考下2014-04-04如何利用HttpClientFactory實現(xiàn)簡單的熔斷降級
這篇文章主要給大家介紹了關(guān)于如何利用HttpClientFactory實現(xiàn)簡單的熔斷降級的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07