在 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章