概要
.NET Coreの開発でxUnitを利用してユニットテストをしているとき、テストの中からappsettings.jsonやUserSecretsの設定値を読み込みたい、というニーズがあると思います。
xUnitのテストケースクラスがIClassFixture<TFixture>
を実装していると、xUnit runnerがテストの実行前にTFixture
をインスタンス化してテストケースクラスのコンストラクタに渡してくれます1(他のユニットテストフレームワークで言うところのsetup()
のようなものを想像してもらえれば)。
それを利用して、TFixture
側でappsettings.jsonやUserSecretsを読み込み、テストケースに渡すような実装をしてみます。
実装例
appsettings.jsonやUserSecretsを読み込むTFixtureのコード例
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.PlatformAbstractions;
public class AppSettingsFixture : IDisposable
{
public IConfigurationRoot Configuration { get; private set; }
public AppSettingsFixture()
{
var builder = new ConfigurationBuilder()
.SetBasePath(PlatformServices.Default.Application.ApplicationBasePath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables()
.AddUserSecrets()
;
Configuration = builder.Build();
}
public void Dispose()
{
Configuration = null;
}
}
appsettings.jsonとUserSecretsを利用するためにproject.jsonに変更を加える
.NET Core RC2のUserSecretsの実装では、UserSecretsを読み込むためにproject.json内のuserSecretsId
設定値が必要となっています2。
そのため、project.jsonとappsettings.jsonの2つのファイルがビルドのOutputディレクトリにコピーされるように、project.jsonのbuildOptions:copyToOutput設定値を次のように変更します。
{
"buildOptions": {
"copyToOutput": {
"include": [ "appsettings.json", "project.json" ]
}
}
テストケース側でAppSettingsFixtureを受け取る
public class SomeTest: IClassFixture<AppSettingsFixture>
{
private readonly AppSettingsFixture _appsettingsFixture;
public SomeTest(AppSettingsFixture _appsettings)
{
_appsettingsFixture = _appsettings;
}
[Fact]
public void ItShouldWork()
{
// テストケース内で次のようにアクセス出来る。
// _appsettingsFixture.Configuration
}
}