?目錄
前置條件
Moq
安裝Moq包
Install-Package Moq
????????Moq是一個(gè)Mocking庫(kù)吩愧,通過(guò)它可以輕易地模擬對(duì)象來(lái)進(jìn)行測(cè)試。在我們的例子中,我們將使用Moq來(lái)模擬一個(gè)數(shù)據(jù)庫(kù)訪問(wèn)類敦捧。
xUnit
????????xUnit是一個(gè)基于.NET平臺(tái)的測(cè)試框架转质。它提供了各種測(cè)試機(jī)制,例如類除抛、測(cè)試函數(shù)丧失、斷言等等。在我們的例子中砂代,我們將使用xUnit來(lái)編寫C#代碼的測(cè)試用例蹋订。
TDD
????????測(cè)試驅(qū)動(dòng)開(kāi)發(fā)?(TDD)?是一種軟件開(kāi)發(fā)過(guò)程或方法,開(kāi)發(fā)人員基本上通過(guò)單元測(cè)試開(kāi)始創(chuàng)建軟件——與傳統(tǒng)方法不同刻伊,傳統(tǒng)方法是開(kāi)發(fā)軟件露戒,最后才創(chuàng)建測(cè)試用例以確保成功實(shí)施.
TDD的三個(gè)步驟是紅綠重構(gòu)
紅燈指的是先編寫單元測(cè)試,此時(shí)還沒(méi)有寫任何具體實(shí)現(xiàn)代碼捶箱,所以單元測(cè)試編譯都通不過(guò)智什。
綠燈指根據(jù)編寫的單元測(cè)試,實(shí)現(xiàn)代碼丁屎,目標(biāo)是剛好可以讓測(cè)試通過(guò)荠锭。
重構(gòu)是指的在保證了實(shí)現(xiàn)的代碼可以通過(guò)單元測(cè)試,有了單元測(cè)試的保障之后晨川,重構(gòu)代碼证九。重復(fù)上述的三個(gè)紅綠重構(gòu)步驟。
實(shí)踐
創(chuàng)建項(xiàng)目
dotnet new sln -n Tdddotnet new console -o src/Calculatordotnet new xunit -o test/Calculator.Testsdotnet sln add src/Calculator
dotnet sln add test/Calculator.Tests
紅燈
????????由于TDD是測(cè)試先行共虑,此次我們模擬開(kāi)發(fā)一個(gè)簡(jiǎn)單的計(jì)算器愧怜。所以先寫單元測(cè)試。
usingMoq;namespaceCalculator.Tests;public classCalculatorTests{? ? [Fact]? ? public voidCalculate_WhenCalled_ReturnsNumber()? ? {? ? ? ? Mock calculatorMock = new();? ? ? ? var num1 = It.IsAny();? ? ? ? var num2 = It.IsAny();? ? ? ? var res = It.IsAny();? ? ? ? calculatorMock.Setup(c =>c.Calculate(num1, num2)).Returns(res);? ? ? ? var result = calculatorMock.Object.Calculate(num1, num2);
? ? ? ? Assert.Equal(res, result);
? ? }
}
????????測(cè)試方法先準(zhǔn)備了三個(gè)參數(shù)妈拌,使用了Moq的It.IsAny<>()方法拥坛,這個(gè)方法可以方便的創(chuàng)建一個(gè)對(duì)象。然后是Mock<>泛型方法用來(lái)模擬接口供炎,通過(guò)Setup設(shè)置模擬的接口的參數(shù)傳什么渴逻,返回什么結(jié)果。
????????最后訪問(wèn)了calculatorMock對(duì)象的Object音诫,相當(dāng)于是模擬的ICalculator對(duì)象惨奕。
????????單元測(cè)試編寫完之后蚤氏,是一片紅论泛,無(wú)法編譯的肩钠。因?yàn)槟壳皼](méi)有具體實(shí)現(xiàn)代碼平项。所以我們完成了TDD的第一步,紅燈栗菜。
綠燈
????????TDD的第二步骡男,綠燈赃蛛,我們需要根據(jù)現(xiàn)有的單元測(cè)試庇茫,實(shí)現(xiàn)代碼港粱。讓單元測(cè)試能夠通過(guò)。
首先是定義一個(gè)ICalculator接口,還有Calculate方法
namespaceCalculator;public interfaceICalculator{? ? int Calculate(int num1, int num2);
}
????????運(yùn)行單元測(cè)試查坪,發(fā)現(xiàn)可以通過(guò)寸宏。此時(shí)已經(jīng)完成了第二步,綠燈偿曙。
重構(gòu)
????????由于本文只是介紹TDD氮凝,不涉及復(fù)雜的邏輯。重構(gòu)環(huán)節(jié)根據(jù)具體的業(yè)務(wù)邏輯實(shí)現(xiàn)就好了望忆。
單元測(cè)試一些最佳實(shí)踐
命名遵循? 測(cè)試方法名_測(cè)試方案_預(yù)期行為
測(cè)試代碼避免邏輯罩阵,如if,while,for和switch
避免將Mock對(duì)象當(dāng)作字段在整個(gè)單元測(cè)試方法都依賴,因?yàn)檫@樣可能對(duì)具體一個(gè)Mock對(duì)象有狀態(tài)依賴
總結(jié)
????????在本文中启摄,我們介紹了如何使用xUnit和Moq庫(kù)實(shí)現(xiàn)TDD稿壁。通過(guò)編寫測(cè)試代碼并在功能代碼之前運(yùn)行它,我們能夠快速發(fā)現(xiàn)程序中的錯(cuò)誤鞋仍,并提高代碼質(zhì)量常摧。xUnit提供了各種測(cè)試機(jī)制搅吁,如類威创、測(cè)試函數(shù)、斷言等谎懦,Moq庫(kù)提供了輕松模擬對(duì)象的機(jī)制肚豺。如果您正在尋找一個(gè)快速、簡(jiǎn)單界拦、可靠的開(kāi)發(fā)方法來(lái)編寫高質(zhì)量的代碼吸申,請(qǐng)嘗試TDD。