はじめに
ASP.NET CoreではコントローラーやRazorPagesに対するインテグレーションテストを想定して、インメモリでテスト用WebサーバーをホストするためのWebApplicationFactory
クラスがあらかじめ用意されています。このクラスの利用方法はASP.NET Core MVC アプリのテストにまとめられていますが、対象がXUnitになっているためNUnitの場合このままでは利用できません。
この記事では、ASP.NET Core+NUnitを利用したインテグレーションテストの開始方法を説明します。
テスト用プロジェクトの作成と必要なパッケージのインストール
dotnetコマンドで作られるテスト対象のWebApiプロジェクトと、NUnitを利用したテストプロジェクトを追加していきます。
テストプロジェクトはテスト対象のWebApiプロジェクトに対する参照と、WebApplicationFactory
クラスを利用するためにMicrosoft.AspNetCore.Mvc.Testing
パッケージを追加します。
dotnet new webapi -o ASPNETCoreNUnitItSample/WebApi
dotnet new nunit -o ASPNETCoreNUnitItSample/WebApi.Tests
cd ASPNETCoreNUnitItSample
dotnet new sln
dotnet sln add ./WebApi/WebApi.csproj
dotnet sln add ./WebApi.Tests/WebApi.Tests.csproj
dotnet add ./WebApi.Tests/WebApi.Tests.csproj reference --interactive ./WebApi/WebApi.csproj
dotnet add ./WebApi.Tests/WebApi.Tests.csproj package Microsoft.AspNetCore.Mvc.Testing
Visual Studioでソリューションを開くと、次のような構成のソリューションが作成されます。
インテグレーション用テスト用Webサーバーの起動コードを追加
まずはプロジェクトファイルの<Project Sdk="Microsoft.NET.Sdk">
を<Project Sdk="Microsoft.NET.Sdk.Web">
に変更します。
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="5.0.1" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.16.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\WebApi\WebApi.csproj" />
</ItemGroup>
</Project>
続いて、テスト用Webサーバーの起動クラスを追加します。
using Microsoft.AspNetCore.Mvc.Testing;
namespace WebApi.Tests
{
public class ApiWebApplicationFactory: WebApplicationFactory<WebApi.Startup>
{
}
}
テストコードの追加
XUnitの例では、IClassFixture<T>
を継承することでWebApplicationFactory
のインスタンスを取得していましたが、NUnitではIClassFixture
は使えないので、OneTimeSetup属性で指定したメソッドでApiWebApplicationFactory
を作成し、HttpClientを取り出してこれを利用します。
using System.Net.Http;
using System.Threading.Tasks;
using NuGet.Frameworks;
using NUnit.Framework;
namespace WebApi.Tests.Controllers
{
[TestFixture]
class WeatherForecastControllerTest
{
private HttpClient _httpClient;
[OneTimeSetUp]
public void OneTimeSetup()
{
var factory = new ApiWebApplicationFactory();
_httpClient = factory.CreateClient();
}
[Test]
public async Task GetTest()
{
var response = await _httpClient.GetAsync("/WeatherForecast");
Assert.IsTrue(response.IsSuccessStatusCode);
}
}
}
まとめ
- NUnitでインテグレーションテストを実施する場合は、自分で
Microsoft.AspNetCore.Mvc.Testing
パッケージを追加する - Factoryの生成はOneTimeSetupで指定したメソッドで実施する
実際にインテグレーションテストを実施する場合は、ConfigureWebHostメソッドをオーバーライドしてデータベースの参照先をRDBからメモリーデータベースにしたり、外部サービスをモックに差し替えるなどいくつか追加で実施する必要がありますが、実施方法はXUnitと変わりがありませんのでASP.NET Core MVC アプリのテストのASP.NET Core アプリを機能テストするを参照してください。