# [快速筆記] Xunit test 時使用 DI 取得物件 ###### tags: `Test` `xUnit.net` `C#` ## 前言 當想要進行整合測試的時候想要從DI取得物件進行測試時,可以透過[`WebApplicationFactory`](https://docs.microsoft.com/zh-tw/dotnet/api/microsoft.aspnetcore.mvc.testing.webapplicationfactory-1?view=aspnetcore-5.0)的協助,可以將啟動應用程式的作業帶入(ex.`Startup`or`Program`),後續可以進行測試作業。 ## 目錄 [TOC] # 實作 ## 程示範例 這邊會使用到[`IClassFixture`](https://xunit.net/docs/shared-context#class-fixture)的介面來進行,此介面指定再進行測試時之前後的作業且可以共用(同一份測試檔案),且測試完成會清理資源 ```csharp= public class AuthControllerTests : IClassFixture<WebApplicationFactory<Startup>> { private readonly IAuthService _authService; public AuthControllerTests(IClassFixture<WebApplicationFactory<Startup>> fixture) { // 透過 GetService 取得DI物件 var _authService = (IAuthService)fixture.Services.GetService(typeof(IAuthService)) } } ``` ### 補充 如果需要依據不同環境下去執行,可以建立一個`Class`去繼承`WebApplicationFactory`,其`IClassFixture<T>`則替換成新建立的`Class`,作法如下 ```csharp= //建立自己的Factory,並將環境變數改成Tests public class ApiWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class { protected override void ConfigureWebHost(IWebHostBuilder builder) { // 這邊可以指定環境 builder.UseEnvironment("Tests"); } } ``` 因為是繼承所以使用方式也就差不多,這邊也不在說明了。 <br/> --- 相關參考來源: [xUnit](https://xunit.net/docs/shared-context)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up