【C#/.NET】xUnit和Moq實(shí)現(xiàn)TDD

?目錄


前置條件

Moq

xUnit

TDD

實(shí)踐

創(chuàng)建項(xiàng)目

紅燈

綠燈

重構(gòu)

單元測(cè)試一些最佳實(shí)踐

總結(jié)


前置條件

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。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末享甸,一起剝皮案震驚了整個(gè)濱河市截碴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛉威,老刑警劉巖日丹,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蚯嫌,居然都是意外死亡哲虾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門择示,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)束凑,“玉大人,你說(shuō)我怎么就攤上這事栅盲⊥羲撸” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵谈秫,是天一觀的道長(zhǎng)扒寄。 經(jīng)常有香客問(wèn)我拴签,道長(zhǎng),這世上最難降的妖魔是什么旗们? 我笑而不...
    開(kāi)封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任蚓哩,我火速辦了婚禮,結(jié)果婚禮上上渴,老公的妹妹穿的比我還像新娘岸梨。我一直安慰自己,他們只是感情好稠氮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布曹阔。 她就那樣靜靜地躺著,像睡著了一般隔披。 火紅的嫁衣襯著肌膚如雪赃份。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天奢米,我揣著相機(jī)與錄音抓韩,去河邊找鬼。 笑死鬓长,一個(gè)胖子當(dāng)著我的面吹牛谒拴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涉波,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼英上,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了啤覆?” 一聲冷哼從身側(cè)響起苍日,我...
    開(kāi)封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窗声,沒(méi)想到半個(gè)月后相恃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫌佑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年豆茫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屋摇。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揩魂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炮温,到底是詐尸還是另有隱情火脉,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站倦挂,受9級(jí)特大地震影響畸颅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜方援,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一没炒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧犯戏,春花似錦送火、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至呀非,卻和暖如春坚俗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岸裙。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工猖败, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哥桥。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓辙浑,卻偏偏與公主長(zhǎng)得像激涤,于是被迫代替她去往敵國(guó)和親拟糕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容