作為我關於.NET模擬框架及其工作方式的博客系列的伴侶,此存儲庫嘗試使用每個可用的.NET可用的主要模擬框架來通過模擬實現相同的單元測試。
該項目旨在作為希望比較.NET模擬框架或有關給定框架的語法示例的任何人的參考。這並不是要詳盡的參考,而不是無障礙(但是如果您發現任何問題,請告訴我)。
為了編寫測試,我們需要一些需要測試的代碼。因此,我已經創建了LunchNotifier ,這是一個稍有少量的班級課程,可以用該課程編寫單位測試(帶有模擬)。
在紐約辦公室工作的堆疊溢出的股東提供的好處之一是內部廚師的免費午餐。每天,當廚師完成準備餐點時,向辦公室的員工發出了通知,讓他們知道可以使用食物。
在CodeBeingTested項目中, LunchNotifier類是我們的主要目標。
該課程具有五個外部依賴關係,需要嘲笑以執行我們的測試:
INotificationService (通過構造器注入)ILogger (通過構造函數注入)IEmployeeService (通過構造函數注入)IEmployee對象)IEmployee (從IEmployeeService返回)System.DateTime主要邏輯是在LunchNotifier.SendLunchtimeNotifications()中。此方法包括對System.DateTime.Now內聯呼叫。 dateTime.now,該呼叫無法通過諸如MOQ或Rhinomocks(例如:
public void SendLunchtimeNotifications()
{
var now = DateTime.Now;
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
提供了替代實現,以LunchNotifier.SendLunchtimeNotifications_DateTimeSeam() ,其中調用DateTime.Now已將其提取到其自己的方法中,可以用一個模擬替換:
public virtual DateTime GetDateTime() => DateTime.Now;
public void SendLunchtimeNotifications_DateTimeSeam()
{
var now = GetDateTime();
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
其餘的每個項目都試圖使用不同的模擬框架對LunchNotifier實施類似的單元測試。
所有測試均使用Nuget軟件包使用Nunit v3.10編寫。
在某些情況下,有多種方法可以使用模擬框架進行測試,因此我提供了測試的多種變體來展示不同的方法。
該測試創建了一個模擬員工“鮑勃”,他更喜歡電子郵件通知,並使用模擬來確保LunchNotifier邏輯在午餐準備就緒時向他發送電子郵件。
該測試創建了兩個模擬員工,“鮑勃”和“瑪莎”,並確保如果向其中一個發送通知會導致登錄錯誤,並且不會阻止其餘員工獲得通知。
該測試使用Nunit的TestCase語法運行兩個測試用例,一個在下午1點之前,另一個在下午1點以後,以確保根據一天中的時間使用適當的通知模板。
對於不受約束的框架, DateTime.Now可以直接控制DateTime以返回測試的輸入時間,但是,受約束的框架不能,因此他們必須將調用撥打到DateTime.Now現在,將其提取到Sperate方法中,然後修改該新方法的行為。因此,需要SendLunchtimeNotifications_DateTimeSeam變體。
類型:受約束
項目:https://github.com/moq/moq4/wiki/quickstart
nuget:https://www.nuget.org/packages/moq/
類型:受約束
項目:https://github.com/hibernating-rhinos/rhino-mocks
nuget:https://www.nuget.org/packages/rhinomocks
警告: Rhinomocks實際上是一個死亡的項目,可能不會為.NET(例如.NET Core)的未來變化提供支持。如果您尚未使用此框架,我不建議您開始使用此框架。
要運行這些測試,您必須安裝VS2017 Enterprise(或Equiv)。
類型:受約束
項目:http://nsubstitute.github.io/
Nuget:https://www.nuget.org/packages/nsubstitute
類型:不受限制
Microsoft假貨是Visual Studio 2017 Enterprise或Visual Studio 2015 Ultimate的一部分,並且不作為Spere Compontime。
假貨不在本地支持AssertWasCalled樣式驗證,因此我使用額外的Nuget軟件包(我為此做出了貢獻)來提供該功能:fakes.contrib / nuget
類型:不受限制
產品信息:https://www.typemock.com/isolator
該產品需要付費許可證(有15天的免費試用版)才能進行無限制的嘲笑。 Typemock足夠好,可以為我提供免費的社區許可證,以便我可以從事這樣的項目。