[ASP.NET Core 5] 利用 WebApplicationFactory 進行 Web API 整合測試

以往 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

範例位置

sample.dotblog/WebAPI/Lab.Test.WebApi at 0c60abb38afdb7a54db4db73eced495ad049149c · yaochangyu/sample.dotblog (github.com)

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo