.NET使用Moq進(jìn)行單元測(cè)試
本篇體驗(yàn)Moq的一些基本用法。首先通過(guò)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的實(shí)例
模擬方法后執(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ù)類(lèi)型是委托
模擬方法依次返回多個(gè)值
[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方法可以為方法返回多個(gè)值
如果把以下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é)果,測(cè)試不通過(guò)。因?yàn)镾utupSequence返回方法返回值的時(shí)候是有順序的。
模擬第二次調(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);
}
}- 通過(guò)Throws方法,在第二次調(diào)用IsEnable()方法時(shí)拋出異常。
直接返回被模擬方法的原始返回值
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類(lèi)中,IsEnabled方法內(nèi)部拋出異常。當(dāng)把Moq實(shí)例的CallBase屬性設(shè)置為true,并調(diào)用CallBase方法,可在測(cè)試方法中直接返回被模擬類(lèi)中方法的原始返回值。
模擬泛型類(lèi)
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進(jìn)行單元測(cè)試的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET在MVC中MaxLength特性設(shè)置無(wú)效的解決方法
這篇文章主要介紹了ASP.NET在MVC中MaxLength特性設(shè)置無(wú)效的解決方法,涉及對(duì)MVC中表單元素屬性的應(yīng)用技巧,需要的朋友可以參考下2014-11-11
在 .NET 項(xiàng)目中復(fù)制資源文件夾到生成目錄的方法
本文主要介紹在使用 Visual Studio 進(jìn)行調(diào)試和發(fā)布時(shí),如何在 .NET 項(xiàng)目中復(fù)制資源文件夾到生成目錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03
引用母版頁(yè)后在page頁(yè)面修改母版頁(yè)控件的值的方法
引用母版頁(yè)后在page頁(yè)面修改母版頁(yè)控件的值的方法,需要的朋友可以參考一下2013-03-03
asp.net 使用js分頁(yè)實(shí)現(xiàn)異步加載數(shù)據(jù)
這篇文章主要介紹了asp.net使用js分頁(yè)實(shí)現(xiàn)異步加載數(shù)據(jù),需要的朋友可以參考下2014-04-04
.NET截取指定長(zhǎng)度漢字超出部分以"..."代替 實(shí)例分享
.NET截取指定長(zhǎng)度漢字超出部分以"..."代替 實(shí)例分享,需要的朋友可以參考一下2013-06-06
理解ASP.NET Core 啟動(dòng)類(lèi)(Startup)
這篇文章主要介紹了ASP.NET Core 啟動(dòng)類(lèi)(Startup),文中運(yùn)用代碼講解相關(guān)知識(shí)非常詳細(xì),感興趣的小伙伴可以參考一下2021-09-09
如何利用HttpClientFactory實(shí)現(xiàn)簡(jiǎn)單的熔斷降級(jí)
這篇文章主要給大家介紹了關(guān)于如何利用HttpClientFactory實(shí)現(xiàn)簡(jiǎn)單的熔斷降級(jí)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07

