主頁 > .NET開發 > 在 xunit 測驗專案中使用依賴注入

在 xunit 測驗專案中使用依賴注入

2020-12-27 06:01:26 .NET開發

在 xunit 測驗專案中使用依賴注入

Intro

之前寫過幾篇 xunit 依賴注入的文章,今天這篇文章將結合我在 .NET Conf 上的分享,更加系統的分享一下在測驗中的應用案例,

之所以想分享這個話題是因為我覺得在我們開發程序中測驗是非常重要的一部分,高質量專案的一個重要指標就是測驗覆寫率,同時依賴注入已經是一個現代化應用中不可缺少的一部分,我們的 .NET Core 也是從一開始就集成了依賴注入,依賴注入對于測驗專案也是不能缺席的,

xunit 是 .net 里目前使用的最多的測驗組件,Xunit.DependencyInjection 是大師寫的一個 xunit 依賴注入的擴展,它是基于微軟的 GenericHost(通用主機) 來實作的,使用它我們可以很輕松的實作依賴注入,很好的和 .NET Core 做集成,

How it works

那它是如何作業的呢?我們一起來看一下它的執行流程,它的執行流程分為四步

首先需要構建一個 Host,然后啟動這個 Host,啟動完成后執行測驗用例,最后終止這個 Host

執行流程

Host 又是如何構建的呢?我們一起看一下,Host 的構建也是分為四步

第一步,創建一個 HostBuilder,大多數情況下我們不需要用這個方法,使用默認的實作就好

第二步,Host 配置,對 Host 做一些自定義配置

第三步,服務配置,注冊需要的服務

第四步,Configure,可以做一些初始化的配置,比如配置初始化以及測驗資料的初始化等

Host構建流程

我們可以在測驗專案里創建一個 Startup 類來控制 Host 的構建程序

示例

接著我們來看一些實際的測驗示例,示例分為三部分,首先是一些基本用法,然后是和其他組件的集成,最后是一些擴展用法

Get Started

首先來看一下 Startup 的用法,這個 Startup 和 asp.net core 里的 Startup 是很像的,無論是使用方式上還是實作上都是類似的,有興趣的可以看一下原始碼對比一下,我們來看一下使用方式,通過下面的示例來感受一下

如果你只需要注冊服務,直接在 Startup 中添加一個 ConfigureServices 方法,在這個方法中注冊自己需要的服務即可,和 asp.net core 并無太多不同

如果你需要做一些初始化的作業,可以加一個 Configure 方法,在這個方法中實作自己的初始化邏輯就可以了,如果初始化的時候需要獲取注入的服務實體,直接作為方法引數就可以,類似于 asp.net core 中 Configure 方法,只是不需要配置 Http 請求管道

如果你需要使用的配置,需要使用 Configuration,可以在 ConfigureHost 方法中通過 ConfigureHostConfiguration 擴展方法注冊自己的配置

如果需要在注冊服務的時候用到配置,可以在 ConfigureServices 方法中添加一個 HostBuildContext 的引數,HostBuilderContext 中的 Configuration 物件就是在 ConfigureHost 中注冊的配置

如果需要在 Configure 方法中使用配置,直接添加一個 IConfiguration 的方法引數就可以了

我們再來看一下,如何在測驗用例中使用注入的服務,一般情況下我們會直接通過構造器注入,在構造方法中添加需要注入的服務即可,除此之外我們還可以通過方法引數注入,結合 InlineDataMemeberData 使用,來看一下這個示例

IoC/AOP Integration

接著我們來看一下和其他組件的集成,AutoFac 是一個很流行的 IOC 組件,AspectCore 是檸檬大佬寫的一個 AOP 框架,我們以這兩個為例子來看一下如何集成第三方的依賴注入和 AOP 組件,前面我們已經提到它是基于微軟的 GenericHost 實作的,而 asp.net core 從 3.0 開始也是基于 GenericHost 實作的,所以在 asp.net core 里怎么集成,在這里也是一樣的,來看一下示例,只需要使用對應的 ServiceProviderFactory 就可以了,是不是很簡單呢

Test Server Integration

然后我們來看一下如何和 TestServer 做集成,TestServer 主要用于集成測驗,使用 TestServer 的好處在于它是基于記憶體進行互動的沒有真正的 HTTP 請求和 TCP 鏈接,會非常的高效,而且也不會監聽某一個埠,所以不會有埠權限的問題,

TestServer 的使用主要有兩步,首先是服務的注冊,可以使用 IHostBuilderIWebHostBuilderUseTestServer 擴展方法注冊 TestServer,可以使用 IHostGetTestClient 擴展方法來注冊和 TestServer 進行互動的 HttpClient

服務注冊好之后就可以在測驗用例里通過注入的 HttpClient 請求 API 或頁面了,可以參考這個例子

Extensions

Hosted Service

然后我們來看一些擴展用法,IHostedService 可以用來實作一些初始化的操作或者后臺服務,我們可以使用 IHostedService 來實作對應用的 Ready 檢查,應用 Ready 之后再開始執行測驗用例,這在有些場景下是很有用的

我們在 k8s 中部署的應用一般都會有一個 HealthCheck/ReadinessCheck 的介面來供 k8s 的 liveness/readiness 探針來探測應用的狀態,只有應用 Ready 之后才會對外部提供服務

這個示例就是一個使用 IHostedService 來實作等待應用 Ready 后再開始執行測驗用例的一個 demo

注意:這里的等待不能在 StartupConfigure 方法中執行,因為 Configure 的執行是在呼叫 Host 的 StartAsync 方法之前執行的,而此時 webServer 還沒有啟動,所以是不能獲取到 TestClient 的,而我們通過 HostedService 就可以在 Web Server 啟動之后再執行我們的等待 Ready 邏輯

ITestOutputHelperAccessor

在測驗中如果想要輸出一個日志的話只能借助于 ITestOutputHelper 來輸出,直接使用 Console.Write[Line] 是看不到任何輸出的,ITestOutputHelper 只能在測驗用例中使用,在測驗服務中是不能使用的,Xunit.DependencyInjection 提供了一個 ITestOutputHelperAccessor 的服務,類似于 IHttpContextAccessor,我們可以借助它來在自定義的服務中獲取 ITestOutputHelper 來輸出日志

這里是一個簡單的示例

Logging

再來看一個 OutputHelperAccessor 的實際應用,Xunit.DependencyInjection 提供了一個 Logging 的擴展,使得我們可以把測驗程序中的日志輸出出來,更好的幫助我們除錯

集成方式也比較簡單,可以參考這個示例,參考 Xunit.DependencyInjection.Logging 之后,在 LoggerFactory 中注冊 XunitTestOutputLoggerProvider 即可

可以看到我們的日志直接輸出出來了,默認的日志級別是 Information ,所以 Debug 級別的日志沒有輸出出來,有需要的話可以在注冊的時候提供一個委托來控制是否要輸出日志

Project Template

為了方便大家使用,我們提供了一個專案模板,可以通過一個命令就可以直接創建好一個測驗專案,會包含一個默認的 Startup 不再需要自己去寫方法了,使用的時候只需要根據需要做刪減就可以了

默認的 TargetFramework 使用的是 netcoreapp3.1,可以通過 -f/--franework 指定自己想要使用的目標框架,比如說想要生成 net 5.0 的專案只需要指定 -f net5.0 就可以了

生成的內容如下所示:

More

最后列出來了一些可能會有幫助的鏈接,第一個是專案的源代碼,第二個是 PPT 中所有示例的源代碼,后面的是使用到的 Nuget 包,

這個 xunit 擴展的代碼實作是非常值得學習的,有很多和 asp.net core 的實作是很像的,有需要的可以去看看原始碼學習一下,

希望我的分享對大家有所幫助,大家在使用程序中有遇到任何問題都可以隨時聯系我或者直接在 Github 上建 issue,

Reference

  • https://github.com/pengweiqhca/Xunit.DependencyInjection
  • https://github.com/WeihanLi/XunitDependencyInjection.Samples
  • https://www.nuget.org/packages/Xunit.DependencyInjection
  • https://www.nuget.org/packages/Microsoft.AspNetCore.TestHost
  • https://www.nuget.org/packages/Xunit.DependencyInjection.Logging
  • https://www.nuget.org/packages/Xunit.DependencyInjection.Template

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/240726.html

標籤:.NET Core

上一篇:ML.net重新訓練模型需要注意的事項。

下一篇:ML.net重新訓練模型需要注意的事項。

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more