在 Xunit 中使用依賴注入
Intro
之前寫過一篇 xunit 的依賴注入相關的文章,但是實際使用起來不是那么方便
今天介紹一個基于xunit和微軟依賴注入框架的“真正”的依賴注入使用方式 ——— Xunit.DependencyInjection, 來自大師的作品,讓你在測驗代碼里使用依賴注入像 asp.net core 一樣輕松
使用一覽
包參考
在 xunit 測驗專案里添加對 Xunit.DependencyInjection 的參考
dotnet add package Xunit.DependencyInjection
新建自己的 Startup
需要實作自己的一個 Startup ,在 Startup 里進行服務注冊和初始化
// 這里需要指定一個 assembly attribute 用來讓 xunit 尋找測驗入口,使用自定義的測驗框架
// TestFramework 第一個引數是 Startup 類的 FullName(包含命名空間),第二個引數是測驗專案的程式集名稱
[assembly: TestFramework("XUnitDependencyInjectionSample.Startup", "XUnitDependencyInjectionSample")]
namespace XUnitDependencyInjectionSample
{
// Startup 需要繼承于 DependencyInjectionTestFramework
public class Startup : DependencyInjectionTestFramework
{
public Startup(IMessageSink messageSink) : base(messageSink)
{
}
// 重寫 CreateHostBuilder 這個方法,在這里進行配置注冊和服務注冊
protected override IHostBuilder CreateHostBuilder(AssemblyName assemblyName)
{
var hostBuilder = base.CreateHostBuilder(assemblyName);
hostBuilder
// 注冊配置
.ConfigureAppConfiguration(builder =>
{
builder
.AddInMemoryCollection(new Dictionary<string, string>()
{
{"UserName", "Alice"}
})
.AddJsonFile("appsettings.json")
;
})
// 注冊自定義服務
.ConfigureServices((context, services) =>
{
services.AddSingleton<IIdGenerator, GuidIdGenerator>();
if (context.Configuration.GetAppSetting<bool>("XxxEnabled"))
{
services.AddSingleton<IUserIdProvider, EnvironmentUserIdProvider>();
}
})
;
return hostBuilder;
}
protected override void Configure(IServiceProvider provider)
{
// 有一些測驗資料需要初始化可以放在這里
}
}
}
CreateHostBuilder 其實就是 asp.net core 里的創建一個 HostBuilder ,注冊配置/服務和 asp.net core 里一模一樣,有資料或配置需要在專案啟動時初始化的,可以放在 Configure 方法做,有點類似于 asp.net core 里 Startup 中的 Configure 方法,只是這里我們不需要配置 asp.net core 的請求管道
開始在測驗代碼里使用依賴注入吧
上面的 Startup 配置好以后就可以在測驗代碼里盡情使用依賴注入了,來看下面的兩個示例:
首先我們可以測驗一下內置的服務,就拿 IConfiguration 來測驗吧

再來測驗一下我們自定義注冊的服務:

IOutputHelper 是 xunit 提供的,可以在執行測驗的時候輸出一段文本(使用 Console.WriteLine 是看不到輸出的哦)
來看一下測驗結果

實作原理
Xunit.DependencyInjection 是一個開源專案,你可以在 Github 上獲取到原始碼 https://github.com/pengweiqhca/Xunit.DependencyInjection
Xunit.DependencyInjection 重寫了一套基于 Microsoft.Extensions.DependencyInjection TestFramework,
使得測驗執行可以支持依賴注入的方式,
在構建測驗類時可以從注冊的服務中獲取構造器所需要的引數
在構建測驗方法的時候也可以通過指定 FromServices 來從注冊的服務中獲取對應的服務從而實作方法引數的注入
重寫的 xunit 的類如下

從 5.0 版本開始直接依賴于 Microsoft.Extensions.Hosting,使用通用主機來構建依賴注入測驗框架,
這樣使得我們更方便集成 Configuration ,更像 asp.net core 的配置,更簡潔
More
大師寫的專案真心不錯,但是大師太低調了,寫的很多很實用的專案,攜程的阿波羅的 dotnetcore 支持就是大師一直在維護,,大家快去 Github follow 他吧
大師最近在寫一個 NetCache 的開源專案,一個快取框架,感興趣的可以去看一下,給大師提點 feature ,
專案地址:https://github.com/pengweiqhca/NetCache
Reference
- https://github.com/pengweiqhca/Xunit.DependencyInjection
- https://github.com/WeihanLi/SamplesInPractice/tree/master/XUnitDependencyInjectionSample
- https://github.com/pengweiqhca/NetCache
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/4884.html
標籤:.NET Core
