.NET 單元測試的利劍——模擬框架Moq 前言 這篇文章是翻譯文,因為通過自己參與的項目,越發覺得單元測試的重要性,特別是當跟業務數據打交道的時候的,Moq就如雪中送炭,所以想學習這個框架,就從這篇譯文開始吧,順便提升下自己英文閱讀水平吧,由於英語實在不行,藉助有道翻譯有時候還理解不了原文的意思。 ...
.NET 單元測試的利劍——模擬框架Moq
前言
這篇文章是翻譯文,因為通過自己參與的項目,越發覺得單元測試的重要性,特別是當跟業務數據打交道的時候的,Moq就如雪中送炭,所以想學習這個框架,就從這篇譯文開始吧,順便提升下自己英文閱讀水平吧,由於英語實在不行,藉助有道翻譯有時候還理解不了原文的意思。湊合的看吧,下一篇介紹moq的使用demo
原文地址:https://github.com/moq/moq4
什麼是Moq
Moq(發音—"mock-you"或是"mock")是一個針對.net開發只用於模擬的庫,它充分利用了.NET LINQ表達式樹和Lambda表達式的優勢,使更具有生產效率,類型安全和友好重構的可模擬的類庫。並且能像模擬Class類一樣模擬Interface。API非常簡潔和直接,不需要太多的前面的知識或是模擬概念的經驗。
為什麼?
因為這個庫是由那些沒有使用過任何模擬類庫的開發者創建的(或是對那些已經實現的庫太過複雜而不滿),代表性的他們通過手動的去寫他們自己的模擬(帶著或多或少的“幻想”)。在這種情況下,大多數開發者非常關註實效,遵循TDD。這是一種感覺,從其他模擬庫中進入的障礙有點高,而且有更簡單,更輕量,更優雅的方法是有可能的。Moq通過帶著C#簡潔優雅以及VB的語言特性他們統一稱為LINQ,能滿足所有的上面說的這些(並不只是縮略詞LINQ(查詢)的意思)。
Moq被設計成為一個非常實用,直接的方式為你的測試去設置依賴。它的API設計甚至幫助初學者用戶在“成功的坑”里並且能避免最常見的模擬錯誤。
當它被構思出來的時候,它就是唯一一個與那些有別於普通的和不直觀的(特別是針對新手)記錄/回放方法的模擬庫框架(這是好的)
不使用Record/Replay也意味著將那些通常的期望轉移到一個fixture設置方法是非常簡單的,甚至能覆蓋那些期望在特定的單元測試中。
你可以在 kzu's blog 看到更多關於“為什麼?”的細節以及一些不錯的截圖信息。
下載安裝
在kzu's blog 上看到更多關於mock的通知。從Scott Hanselman 獲得一些模擬狀態的背景知識
特征
Moq提供下麵這些特征
- 強類型:沒有字元串的期望,沒有object類型的返回值或者是約束
- 智能提示:所有的一切都完美支持VS智能感知,從設置期望值,到指定方法調用參數,返回值等等。
- 不需要瞭解Record/Replay的習慣。只需要構造你的模擬,設置好並使用它,可選的驗證它(你也許不做驗證,當它作為存根(stubs)時,或者當你在做更傳統的基於狀態的測試時,通過檢查對象返回的值)
- 前三點的影響,學習曲線非常低。在大多時候,你無需閱讀文檔。
- 通過簡單的MockBehaviorm枚舉對模擬的行為細粒度控制(Granular control)(無需模擬,存根(stub),偽造(fake),動態模擬等等)
- 介面和類都能模擬
- 覆蓋期望:能設置預設的期望在一個fixture設置,並且根據測試需要覆蓋
- 為模擬類傳遞構造函數參數
- 在模擬中截斷器和觸發事件
- 能支持out/ref參數