web-dev-qa-db-ja.com

asp.netコアでIConfigurationのインスタンスを取得する方法は?

私はwebapiをテストするユニットテストプロジェクトを作成していますが、コントローラを初期化する必要があるのは、コンストラクタで依存関係の注入によって提供され、正常に動作するIConfigurationを受け取ることです。

しかし、手動で初期化する場合、このインスタンスを取得する方法はありません。

同じプロジェクト内にないunittestプロジェクトから初期化しようとしています。

コントローラーは次のようになります。

public Controller(IConfiguration configuration) { _configuration = configuration; }
10
Rabel Obispo

.Net Coreアプリケーションでは、IConfigurationのインスタンスをコントローラーまたは他のクラスに渡すべきではないというステートメントから開始する必要があります。 IOptions<T>を介して注入された強く型付けされた設定を使用する必要があります。詳細については、この記事を参照してください: ASP.NET Coreのオプションパターン

オプションパターンを使用する場合、コントローラーに必要な設定用のPOCOがあります。この設定オブジェクトは、IOptions<T>にラップされたコントローラーに挿入されます。

public class ControllerSettings
{
    public string Setting1 { get; set; }

    public int Setting2 { get; set; }

    // ...
}

public class Controller
{
    private readonly ControllerSettings _settings;

    public Controller(IOptions<ControllerSettings> options)
    {
        _settings = options.Value;
    }
}

その後、単体テストから必要な設定を渡すのは非常に簡単です。設定インスタンスを埋め、_ MoqNSubstitute のような利用可能なモックフレームワークでIOptions<T>にラップするだけです。

[TestMethod]
public void SomeTest()
{
    var settings = new ControllerSettings
    {
        Setting1 = "Some Value",
        Setting2 = 123,
    };

    var options = new Mock<IOptions<ControllerSettings>>();
    options.Setup(x => x.Value).Returns(settings);

    var controller = new Controller(options.Object);

    //  ...
}

統合テストを開発するときなど、プロジェクトの実際の構成を使用する必要がある場合があります。この場合、ConfigurationBuilderのインスタンスを作成し、テストされたコードと同じ構成ソースで埋めることができます。

IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
// Duplicate here any configuration sources you use.
configurationBuilder.AddJsonFile("AppSettings.json");
IConfiguration configuration = configurationBuilder.Build();
24
CodeFuller