在 Xunit 中使用依賴註入 Intro 之前寫過一篇 xunit 的依賴註入相關的文章,但是實際使用起來不是那麼方便 今天介紹一個基於xunit和微軟依賴註入框架的“真正”的依賴註入使用方式 ——— Xunit.DependencyInjection, 來自大師的作品,讓你在測試代碼里使用依賴註 ...
在 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