標籤:nmock 單元測試 資料庫類比 類比 介面類比
介紹 單元測試是對一個系統的最小可測試單元的檢查和驗證,系統裡關鍵點位的規則、關鍵的邏輯均可建立一個單元測試,但是對於一些存在不確定行為對象的測試或者資料庫操作的測試不確定因素比較高,初期對此建立的單元測試往往在中後期被廢棄掉,原因無非是資料庫表的改變或者資料改變或者對象結構改變等等諸多不確定因素的影響。所以要想系統地建立一個單元測試並最大化其作用,我們必須先解決對象行為的不確定性。可以考慮通過依賴介面的方式將這些行為模組化地進行隔離,單元測試只需要類比這些介面然後注入到需要單元測試的類中,這樣就可以將不確定的對象與單元測試解耦並無需依賴。NMock的功能就是這樣實現的,NMock是通過對介面的屬性、方法、事件的類比,從而實現無需依賴介面實作類別即可進行單元測試的效果(原理是運行時通過動態代理的方式建立對象)。 這樣看來要想使用NMock進行單元測試的輔助,你的系統必須是面向介面來編程的,也就是說你要測試的類對外部的依賴必須是介面依賴。目前我想到的適合的應用情境有兩個:
- MVP架構模式系統對控制器的單元測試的建立。MVP架構模式是以介面的方式將視圖層和商務邏輯進行分離,對於系統的開發我們只需要定義視圖介面而無需關心其具體實現,你可以寫好控制層,並定義了視圖介面具體的UI邏輯可以慢慢實現,這時由於沒有具體實現,想要進行控制器的單元測試可以藉助於NMock來對視圖進行類比。
- DDD領域驅動對於領域層的單元測試的建立。DDD領域驅動實現過程中對於倉儲的調用只需在領域層定義一個介面,然後具體實現可無需關心,領域層對於資料的持久化只需依賴倉儲介面。當想要對領域層的彙總根等類進行測試時就可以用NMock來對倉儲進行類比。
以上兩個是我學習了NMock之後所想到的兩個應用情境,也是接下來兩篇部落格準備具體介紹的。個人認為只要是面向介面方式的編程,單元測試的時候基本上可以使用NMock進行輔助測試。基礎環境搭建 我所使用的NMock是3版本的即NMock3,NMock的官網是:http://nmock3.codeplex.com/ 下載目錄如下
可支援Framework4 和Framework3.5,Tutorials是一個教程項目,我使用的是Fx3.5版本的,下載NMock3 Fx 3.5 解壓只有一個dll,單元測試的項目引用即可
執行個體代碼 首先學習下一些基本的使用代碼,下兩篇再學習下兩個應用情境的執行個體。
首先使用必須要先建立基本工廠:
MockFactory _factory = new MockFactory();
對一個介面的類比可以調用如下代碼:
Mock<IList> _mock = _factory.CreateMock<IList>();
此時的_mock並不是一個IList對象,_mock.MockObject才是IList的類比對象(可以說是實作類別)
對於屬性的期望擷取可以用如下代碼
_View.Expects.One.GetProperty(v => v.ID, 1000);
其中_View是一個建立的類比對象具有一個ID屬性,訪問_View.MockObject.ID時就是1000了。
對於事件的類比可用如下代碼:
_View.Expects.One.EventBinding(v => v.Init += null);
對於方法的類比可用如下代碼:
addressRp.Expects.One .Method(d => d.SaveAddress(null)) .With(adress) .Will(Return.Value(result));
具體的使用方法將在接下來的兩篇進行詳細的介紹。
單元測試學習系列(一)--- NMock對象及資料庫類比介紹