LoginSignup
7
6

More than 5 years have passed since last update.

xUnitのIClassFixtureを使ってappsettings.json内の設定値を読み込む

Posted at

概要

.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
    }
}

備考

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6