轉帖|其它|編輯:郝浩|2010-10-25 15:07:32.000|閱讀 969 次
概述:本文主要介紹如何使用MOQ進行單元測試,從而提高被測對象的測試效果,希望對大家有幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
使用MOQ來偽裝和隔離被依賴對象,從而提高被測對象的測試效果。
安裝
通過可以下載MOQ的最新版本。在SSL項目中,我們使用的是MOQ 3.1.416.3版本。在SCM中項目目錄下的Lib目錄下有該工具的二進制版本。直接在單元測試項目中引用即可。
準備工作
如果你需要測試項目中的Internal成員,你需要在AssemblyInfo.cs中添加如下的Attribute:
#if DEBUG
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2,PublicKey=
00240000048000009400000006020000002400005253" +
"41310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606
cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266" +
"654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667
bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c" +
"4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
#endif
開始測試
一個單元測試的一般流程:
一般情況下,一個單元測試應該被分割為如下四個步驟:
一個單元測試的例子:
開始測試
一個單元測試的一般流程:
一般情況下,一個單元測試應該被分割為如下四個步驟:
準備
搭建環境
構造被測對象
初始化被測對象
構造Mock對象
初始化Mock對象
連接被測對象和依賴項
聲明期待
配置Mock(Mock<T>.Setup)對象以聲明該Mock對象期待被怎樣調用。
執行測試
調用被測對象的方法,完成測試步驟
校驗測試結果
調用校驗方法(Mock<T>.VerifyAll)對Mock對象上的期待動作進行校驗。
使用Assert方法對被測對象的狀態進行校驗。
一個單元測試的例子:
開始測試
一個單元測試的一般流程:
一般情況下,一個單元測試應該被分割為如下四個步驟:
準備
搭建環境
構造被測對象
初始化被測對象
構造Mock對象
初始化Mock對象
連接被測對象和依賴項
聲明期待
配置Mock(Mock<T>.Setup)對象以聲明該Mock對象期待被怎樣調用。
執行測試
調用被測對象的方法,完成測試步驟
校驗測試結果
調用校驗方法(Mock<T>.VerifyAll)對Mock對象上的期待動作進行校驗。
使用Assert方法對被測對象的狀態進行校驗。
一個單元測試的例子:
目前的單元測試中,往往準備工作很復雜,反而真正測試的工作比較簡單。就像上面的例子中,準備的代碼寫了8行,其它真正測試所關心的代碼卻只有4行。這是一個非常不舒服的狀態。但是,我也沒有找到更好的方式來解決這個問題。只能說在架構上讓各個模塊的依賴盡可能的小,從而減少準備工作的量。
另一方面,通過在代碼中適當的增加幾行注釋,可以很好的幫助閱讀的人找到重點。我覺的如果整個團隊都采用一致的編碼習慣,閱讀效率會提高很多。如下是上面的例子去除了多余的注釋后的版本。
[TestMethod]
public void TestNavigationSyncWithSelection()
{
// 測試如果修改Selection,那么NavigationService.MoveCurrentTo方法應該被調用。 << 簡要的注釋描述測試的重點,很多時候"人話"還是簡練很多
// Prepare
var c = new ServiceContainer();
var dataManager = new SpreadSheetDataManager(32, 8);
var selectionService = new SelectionService();
var mockNavigationService = new Mock<INavigationService>();
c.AddService(mockNavigationService);
mockNavigationService.Setup(s => s.CanMoveCurrentTo(It.IsAny<CellPosition>()))
.Returns(true);
c.AddService<ISelectionService>(selectionService);
(selectionService as IService).Attach(c, dataManager);
// Expect
mockNavigationService.Setup(s => s.MoveCurrentTo(new CellPosition(0, 1)));
// Act
selectionService.Select(new CellRange(0, 1, 2, 2));
// Verity
mockNavigationService.VerifyAll();
Assert.AreEqual(new CellRange(0, 1, 2, 2), selectionService.CurrentSelection);
}
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客轉載