以往 ASP.NET Core 可以使用 TestServer 來進行整合測試,現在多了一個選擇 WebApplicationFactory,WebApplicationFactory 基於 TestServer 又封裝了更多的功能,我覺得使用起來又更簡單了,如果可以的話可以改用它
上篇,有 TestServer 的使用方式,有興趣的可以動手實作比較看看。
開發環境
- Windows 10
- ASP .NET Core 5
- Rider 2021.2.1
- Microsoft.AspNetCore.Mvc.Testing 5.0.11
- NSubstitute 4.2.2
實作
先新增一個 Web API .NET 5 的專案
加入以下測試代碼,讓它依賴 IFileProvider
[ApiController]
[Route("[controller]")]
public class DemoController : ControllerBase
{
private readonly IFileProvider _fileProvider;
private readonly ILogger<DemoController> _logger;
public DemoController(ILogger<DemoController> logger,
IFileProvider fileProvider)
{
this._logger = logger;
this._fileProvider = fileProvider;
}
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(QueryResponse))]
public IActionResult Get(CancellationToken cancel = default)
{
return this.Ok(new QueryResponse
{
Message = this._fileProvider.Name()
});
}
}
public class QueryResponse
{
public string Message { get; set; }
}
public interface IFileProvider
{
string Name();
}
public class FileProvider:IFileProvider
{
public string Name()
{
return nameof(FileProvider);
}
}
WebApplicationFactory 基本用法
新增 .NET 5 測試專案
安裝 Microsoft.AspNetCore.Mvc.Testing 套件
dotnet add package Microsoft.AspNetCore.Mvc.Testing --version 5.0.11
實例化 WebApplicationFactory<Startup> 時,會依照 Startup 的設定在測試裡面建立 Web API Server
再呼叫 CreateClient 產生 HttpClient,打 Web API Server,藉此驗證 Web API 功能是否正確
[TestMethod]
public void WebApplicationFactory基本用法()
{
var server = new WebApplicationFactory<Startup>();
var client = server.CreateClient();
var url = "demo";
var response = client.GetAsync(url).Result;
var result = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(result);
}
自訂 WebApplicationFactory
這裡我想要注入一個假物件會需要用到 NSubstitute
dotnet add package NSubstitute --version 4.2.2
當你需要比較多的參數設定你的 Test Server 可以考慮使用自訂 WebApplicationFactory
在這裡我注入假的 IFileProvider
public class CustomTestServer : WebApplicationFactory<Startup>
{
private void ConfigureServices(IServiceCollection services)
{
services.AddScoped(p =>
{
var fileProvider = Substitute.For<IFileProvider>();
fileProvider.Name().Returns("Fake FileProfile");
return fileProvider;
});
}
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(this.ConfigureServices);
}
}
用法就跟上面 WebApplicationFactory 一樣
[TestMethod]
public void CustomTestServer()
{
var server = new CustomTestServer();
var httpClient = server.CreateClient();
var url = "demo";
var response = httpClient.GetAsync(url).Result;
var result = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(result);
}
參考
ASP.NET Core 中的整合測試 | Microsoft Docs
範例位置
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET