実行環境
- .NET 8
- Visual Studio 17.8.3
- xUnit 2.4.2
準備
ASP .NET Core WebAPIのプロジェクトとユニットテストのプロジェクトを作成し、ユニットテストのプロジェクトからWebAPIのプロジェクトを参照するように設定しておきます。
また、Program.csはトップレベルステートメントで書かれていてclassの記述が省略されています。classのアクセス修飾子がpublicになっていないので、public partial class Program{}
という記述を追加します。
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run(); // ここを追加 public partial class Program{ }
コントローラはデフォルトで作られるWeatherForecastControllerをそのまま使います。
public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; } [HttpGet(Name = "GetWeatherForecast")] public IEnumerable<WeatherForecast> Get() { return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }) .ToArray(); } }
テストを書く
テストフレームワークはxUnitを使います。コンストラクタで注入されるWebApplicationFactoryを使っていきます。
public class WeatherForecastControllerTest(WebApplicationFactory<Program> factory) : IClassFixture<WebApplicationFactory<Program>> { private readonly WebApplicationFactory<Program> _factory = factory; [Fact] public async Task GetTestAsync() { var client = _factory.CreateClient(); var response = await client.GetAsync("/WeatherForecast"); Assert.True(response.IsSuccessStatusCode); } }
テストを実行して成功することが確認できました。