1. 程式人生 > >使用 Moq 測試.NET Core 應用

使用 Moq 測試.NET Core 應用

 什麼是Mock

當對程式碼進行測試的時候, 我們經常需要用到一些模擬(mock)技術.

綠色的是需要被測試的類, 黃色是它的依賴項, 灰色的無關的類

在一個專案裡, 我們經常需要把某一部分程式獨立出來以便我們可以對這部分進行測試. 這就要求我們不要考慮專案其餘部分的複雜性, 我們只想關注需要被測試的那部分. 這裡就需要用到模擬(Mock)技術.

因為, 請仔細看. 我們想要隔離測試的這部分程式碼對外部有一個或者多個依賴. 所以編寫測試程式碼的時候, 我們需要提供這些依賴. 而針對隔離測試, 並不應該使用生產時用的依賴項, 所以我們使用模擬版本的依賴項, 這些模擬版依賴項只能用於測試時, 它們會使隔離更加容易.

綠色的是需要被測試的類, 黃色Mock的依賴項

Mock技術帶來的優點

使用Mock技術, 可以有如下的優點:

  • 提高測試執行速度, 例如可以模擬DB, Web Service等比較慢的服務, 以及演算法等.
  • 支援並行開發, 例如實際的依賴項還沒有完成開發, 或者等待其他團隊開發依賴項.
  • 提高測試可靠性, 例如有時這個依賴項的bug太多了, 經常由於依賴項的原因導致測試失敗, 那麼就應該使用mock版本來驗證我們自己寫的程式碼.
  • 減少開發/測試成本, 有時程式可能依賴一些雲服務, 這些服務是按呼叫次數收費的, 那麼就可以使用Mock版本來節省這方面的開資, 當然了最後還是需要使用真正的服務測試才行; 有時候組建依賴項太費勁了, 就用mock版本吧, 省時省力.
  • 在有不確定性依賴項的情況下進行測試, 有些依賴項有不確定性, 可能無理由的造成測試失敗, 這時候就應該使用mock版本的依賴.

單元測試

那麼什麼是一個單元? 

這個通常是由團隊對系統的理解決定, 可以針對一個類, 也可以針對多個類.

單元測試通常具有以下特點:

  • 低級別
  • 高聚焦
  • 執行速度快
  • 容易測試所有執行路徑上的程式碼

術語

  • Test Double (我認為可以翻譯為測試替身), 是所有非真實依賴項的總稱.
    • Fake, Fake是那種可以正常工作的實現, 儘管可以正常工作, 但是它們不可以用於生產環境, 例如EFCore裡的記憶體資料庫提供商.
    • Dummy, 有時候, 被測試方法需要一些引數, 但是這些引數實際上並沒有用到, 這時就可以建立dummy, 它們的存在只是為了滿足呼叫方法的引數要求.
    • Stub, (狀態測試). 它可以使用很直接的方式模擬依賴項的行為. 例如我們可以使用Stub把相關資料放到記憶體裡查詢而不是查詢真實的資料庫; 如果某個測試類需要依賴項的某個Property的值, 那麼stub就設定這個值就行.
    • Mock, (行為/互動測試). 與Stub不同的是, Mock期待的不是返回值, Mock期待的是動作的執行. 它是依賴項的動態包裝, 它可以對哪個方法以什麼樣的順序被待測試系統(SUT)呼叫的這個期待行為進行預程式設計. 也就是說被測試的系統只有按照特定的順序呼叫mock依賴項的特定方法, 那麼該系統才算測試通過.

還有其它的一些術語就不介紹了, 主要是這四個.

對於Stub 和 Mock ,可以看下面兩張圖例:

Moq

Moq框架可以用來建立dummy, stub 和 mock. 在本文裡把這三個東西都叫做mock物件吧.

Moq使用一套API來建立stub和mock物件.

準備專案

該專案非常簡單, 是關於球員轉會業務, 它目前只有三個類. 

TransferApplication, 球員轉會申請類:

TransferResult, 轉會審批結果列舉:

還有TransferApproval, 轉會審批類:

'

當前的邏輯是, 發起球員轉會申請後, 進行審批: 如果總費用大於預算, 那麼就直接拒絕; 如果總費用不超標, 並且球員小於30歲, 那麼就批准; 但如果球員大於30歲, 並且是超級巨星的話, 這將由老闆決定.

建立單元測試專案

在解決方案裡建立一個xUnit型別的專案:

然後要保證該專案所用到的庫都保持最新:

最後別忘了新增對FootballManager專案的引用:

開啟Text Explorer, 可以看到裡面有一個待測的單元測試:

做一個簡單的單元測試

把UnitTest1改成下面這個簡單的單元測試:

重新Build後, 可以看到單元測試的名稱更新了.

點選Run All, 執行單元測試, 結果成功:

隨後再新增一個簡單的單元測試:

Build, 後就會出現這個測試:

Run All, 測試也會成功:

新增依賴

這時, 有一些需求的變化, 球員轉會審批前, 需要通過體檢.

首先在轉會申請類裡面新增兩個球員的屬性:

然後新增一個體檢的介面:

這兩個方法的作用是一樣的, 但是呼叫方法略有不同.

但是此時, 該介面的實現類還沒有開發完畢:

在轉會審批類裡面, 需要新增這個依賴, 使用的是介面:

在單元測試類裡面, 我為轉會球員添加了這兩個屬性, 但是審批類會報錯, 因為沒有加入依賴項:

所以測試的時候需要注入這個依賴項IPhysicalExamination, 但是PhysicalExamination類還沒有做完(裡面的方法都沒有實現), 所以我們無法new出來這個類.

這時, 我們也許可以傳null進去?

這時, 專案是不報錯了.

跑單元測試, Run All:

測試失敗, 丟擲NullReferenceException. 而這個異常導致了測試無法正常進行.

所以, 我們需要Moq, 它可以提供一個Mock(模擬)版本的IPhysicalExamination, 並把它傳遞到審批類的建構函式裡.

安裝Moq

在單元測試專案新增Moq:

Moq的第一篇先到這.

相關推薦

使用 Moq 測試.NET Core 應用 -- Mock 行為

src 進行 alt 狀態 執行 ref tro 調用次數 eal 第一篇文章, 關於Mock的概念介紹: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 關於方法Mock的介紹: https://www.cnb

使用 Moq 測試.NET Core 應用 -- 其它

表達 連續 span empty ups 通過 check lin 事件綁定 第一篇文章, 關於Mock的概念介紹: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 關於方法Mock的介紹: https://www.c

使用 Moq 測試.NET Core 應用

 什麼是Mock 當對程式碼進行測試的時候, 我們經常需要用到一些模擬(mock)技術. 綠色的是需要被測試的類, 黃色是它的依賴項, 灰色的無關的類 在一個專案裡, 我們經常需要把某一部分程式獨立出來以便我們可以對這部分進行測試. 這就要求我們不要考慮專案其餘部分的複雜性, 我們只想關注需要被

使用 Moq 測試.NET Core 應用 -- Mock 方法

本文介紹使用Moq來Mock方法. Mock 物件 緊接著上文中的例子. 上一篇文章, 我在單元測試的時候, 把依賴項設為null: 然後便出現了NullReferenceException, 導致測試無法正常執行. 首先應該做的是在TransferApproval的建構函式裡判斷引數是否

使用 Moq 測試.NET Core 應用 -- Mock 屬性

本文介紹Moq的使用. Mock屬性 屬性是指 get set property. 接著上文, 我在03 Before部分的程式碼裡做了一些修改. 首先IPhysicalExamination介面添加了IsMedicalRoomAvailable屬性: 其實現類: 屬性方法內依

使用 coverlet 查看.NET Core應用測試覆蓋率

針對 我只 dir rdo col 使用命令 str nbsp dex Visual Studio 2017的企業版可以直接查看測試的代碼覆蓋率, 而由於我只能用得起Visual Studio Community和VS Code所以不得不尋找其它的辦法來查看測試覆蓋率.

Moq 在.net Core 單元測試中的使用

Moq,主要用來偽造介面的實現類,實現方法,屬性 moq The most popular and friendly mocking framework for .NET What? Moq (pronounced "Mock-you" or just "Mock") is the onl

使用 coverlet 檢視.NET Core應用測試覆蓋率

程式碼覆蓋(Code coverage)是軟體測試中的一種度量,描述程式中原始碼被測試的比例和程度,所得比例稱為程式碼覆蓋率。 Visual Studio 2017的企業版可以直接檢視測試的程式碼覆蓋率, 而由於我只能用得起Visual Studio Community和VS Code所以不得不尋找其它的免

Linux使用Jexus托管Asp.Net Core應用程序

技術 文件目錄 只需要 true 沒有 repr tag 博文 env 第一步 安裝.Net Core環境 安裝 dotnet 環境參見官方網站 https://www.microsoft.com/net/core。 選擇對應的系統版本進行安裝。安裝完成過後 輸入命令查

在 Azure WebApps 中運行64位 Asp.net Core 應用

需求 正常 mmu www. module .config 正在 external doc 作為微軟下一代的開源的跨平臺的開發框架, Asp.net core 正在吸引越來越多的開發者基於其構建現代 web 應用。 目前, Azure App Service 也實現了對 a

Centos7環境下使用Nginx托管.Net Core應用程序

erro else hid dev 直接 update 谷歌瀏覽器 rod ins 一、安裝.Net Core 參考官方文檔:https://www.microsoft.com/net/core#linuxcentos 1、添加dotnet產品Feed 在安裝.NET C

運行Vue在ASP.NET Core應用程序並部署在IIS上

生產環境 所在 來講 一個 重寫 文章 .net core 設置 分享 前言 從.NET Core 1.0開始我們就將其應用到項目中,但是呢我對ASP.NET Core一些原理也還未開始研究,僅限於會用,不過園子中已有大量文章存在,借著有點空余時間,我們來講講如何利用AS

教你如何實現微信小程序與.net core應用服務端的無狀態身份驗證

做的 動圖 ef7 服務端 apt 是我 分布 .net service 隨著.net core2的發布,越來越多人使用.net core2開發各種應用服務端,下面我就結合自己最近開發的一款小程序,給大家分享下,怎麽使用小程序登錄後,小程序與服務端交互的權限控制。

將ASP.NET Core應用程序部署至生產環境中(CentOS7)

for linux home web 虛擬 direct director block bic 閱讀目錄 環境說明 準備你的ASP.NET Core應用程序 安裝CentOS7 安裝.NET Core SDK for CentOS7。 部署ASP.NET

使用Docker部署ASP.NET Core應用程序實踐

4.0 cor run .com cnblogs pda word 本地配置 問題 前言 最近把很火的Docker給看了,於是就磨拳擦掌要去實踐一下。於是就拿之前一個aps.net core的項目(已被停止)去練手。該項目之前在ubuntu14.04上確保可以正常運行,所以

在 Docker 中部署 ASP.NET CORE 應用

post netcore 工作 ros core 指定 們的 本地 body 有了 Docker 之後, 部署起來卻這間非常方便,環境不用搭了, 直接創建一個 microsoft/aspnetcore 的容器, 在本地開發好後, 把內容直接部署到容器中。 下面的命令是把本

新建.Net Core應用程序後引用項一直黃色感嘆號怎麽辦?

右鍵 blog 消失 成功 黃色感嘆號 生成 重新 創建 正常 我們在vs中創建.Net Core應用程序後,引用項可能出現黃色感嘆號,正常情況下,這種黃色感嘆號時能在項目創建成功之後迅速消失的,可也有些時候一直不消失,怎麽辦? 我們可以選中異常的項目,然後右鍵菜單,選擇

NET Core應用框架之BitAdminCore框架應用篇系列

net EDA clas IE span targe slist target nco BitAdminCore是基於NET Core2.0的後端快速開發框架,本篇主要目標是介紹如何使用框架開發應用。框架的一些特性等。 系列鏈接 BitAdminCore框架應用

.net core 應用程序部署到win10子系統中

cnblogs nsh targe aps win10 http spl document first 聲明:本人是個小白,博文中的知識都是我從網上歸類總結而來,主要是記錄一下我的學習歷程;如果各位網友有什麽更好的參考資料歡迎推薦。 最近在學習【騰飛(Jesse)】 大神

Docker打包 Asp.Net Core應用,在CentOS上運行(轉)

ner 表示 exec 但是 服務端 名稱 pro 目前 app 轉載連接:https://www.cnblogs.com/ibeisha/archive/2017/09/09/netcoreondocker.html 本文主要介紹下運用docker虛擬技術打包Asp.n