這裏建立一個類 Product 表明商品; ProductCollection 表明配送的商品集合, DistributeProduct 方法根據傳入的商品 Id 集合表明須要配送的商品(具體看項
目代碼)數據庫
建立一個基於 Framework 的單元測試項目 MyUnitTestApplication ,添加一個單元測試類 ProductCollectionTests , ,添加一個單元測試方
法 ProductCollction_DistributeProduct_Test 編程
在單元測試的方法體內右鍵運行單元測試,以下圖所示,能夠在右側測試資源管理器中看到看到運行結果;例如把第三個斷言修改爲一個錯誤的結果,右
鍵運行單元測試,就會出現測試未經過顯示。框架
這樣一個最簡單的單元測試就寫完了,假如未來有人修改了 DistributeProduct 方法,再將這個單元測試運行一遍就能夠驗證修改是否存在 Bug.單元測試
的是它的 ToNotice 方法向外部發送通知消息。因此這裏的 ProductCollection 對象依賴於 DistributeNotice 對象。可是,通常向外部發送信息須要 一些配置以測試
及 第三方的代理類(外部依賴)。例如以下圖所示: DirstributeNotice 對象依賴着 ConfigurationManager 和 EmailSend 。此時單元測試已經不能進行了,由於需
要考慮其餘的外在因素。spa
咱們的解決方案是:此時咱們能夠添加一個 間接層。讓本來依賴於 類或者 外部資源的對象抽象成依賴於它們的 接口,而後經過接口動態生成一個模擬的實現
類。(這也是設計原則中所謂的 面向接口編程)因而咱們的依賴關係變爲下圖:設計
基於接口重寫編寫單元測試,這裏咱們用到了 Mock 接口單元測試,使用了開源的 Mock 框架 NSubstitute 。(測試過程當中替代真實對象的內存級別虛
擬對象)3d
法的業務邏輯呢?例以下圖所示:咱們在咱們的 ProductCollection 集合類中添加一個方法 ValidatorProduct , ,根據產品的編號,判斷產品的數量和價格是否合適,從而代理
判斷這個產品是否合適。在編寫方法過程當中,咱們遵循單一職責原則,將驗證邏輯碎片化以備未來擴展和重用,可是這些邏輯都是重要邏輯,咱們想
要測試它們,然而咱們只有一個公共的方法入口 ValidatorProduct ,咱們不能單獨的測試其中一個的邏輯。對象
此時咱們的解決方案是:咱們能夠在測試環境下,提供一個繼承於測試類的子類,在子類中提供這些方法的可測試版本。以下圖所示:咱們創建了一個子
類 ProductCollectionAccessibility , ,經過繼承的方式,在 ValidatorPriceAccessibility 方法中和 ValidatorNumberAccessibility 分別測試父類的驗證產品價格和數
量的方法。
咱們常常須要完善咱們的測試用例,
單元測試,基於一個測試用例很完善的單元測試項目,咱們修改後,只須要將單元測試從新運行一遍,就能夠保證重構修改代碼是否有 Bug ,是否有副做
用。