NMock學習系列(一)--- 對象及數據庫模擬介紹

介紹

        單元測試是對一個系統的最小可測試單元的檢查和驗證,系統裏關鍵點位的規則、關鍵的邏輯均可建立一個單元測試,但是對於一些存在不確定行爲對象的測試或者數據庫操作的測試不確定因素比較高,初期對此建立的單元測試往往在中後期被廢棄掉,原因無非是數據庫表的改變或者數據改變或者對象結構改變等等諸多不確定因素的影響。所以要想系統地建立一個單元測試並最大化其作用,我們必須先解決對象行爲的不確定性。可以考慮通過依賴接口的方式將這些行爲模塊化地進行隔離,單元測試只需要模擬這些接口然後注入到需要單元測試的類中,這樣就可以將不確定的對象與單元測試解耦並無需依賴。NMock的功能就是這樣實現的,NMock是通過對接口的屬性、方法、事件的模擬,從而實現無需依賴接口實現類即可進行單元測試的效果(原理是運行時通過動態代理的方式創建對象)。
        這樣看來要想使用NMock進行單元測試的輔助,你的系統必須是面向接口來編程的,也就是說你要測試的類對外部的依賴必須是接口依賴。目前我想到的適合的應用場景有兩個:
  1. MVP架構模式系統對控制器的單元測試的建立。MVP架構模式是以接口的方式將視圖層和業務邏輯進行分離,對於系統的開發我們只需要定義視圖接口而無需關心其具體實現,你可以寫好控制層,並定義了視圖接口具體的UI邏輯可以慢慢實現,這時由於沒有具體實現,想要進行控制器的單元測試可以藉助於NMock來對視圖進行模擬。
  2. 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));

具體的使用方法將在接下來的兩篇進行詳細的介紹。

發佈了62 篇原創文章 · 獲贊 10 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章