1. 程式人生 > 實用技巧 >在 XUnit 中使用依賴注入

在 XUnit 中使用依賴注入

在 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