Closed2

xUnitでAzure Functionsをテストする際に設定が反映されない

waiwai

FunctionsのStartup.csにおいて、下記の記述で設定値を読み込んでいます。

Startup.cs
public override void Configure(IFunctionsHostBuilder builder)
{
    var context = builder.GetContext();
    var hogeName = context.Configuration.GetSection("hoge")["Name"];
    ...
}

Functions自体をローカル実行する際は、ルートパスに配置しているlocal.settings.jsonを勝手に読み込んでくれるので楽チンです。
が、xUnitのテストでFunctionsを起動する際、FunctionsHostBuilderContextに設定値をセットするのに少し手間取りました。備忘録として残しておきます。

waiwai

設定ファイルの配置

appsettings.jsonファイルをテストプロジェクトのルートに配置します。
後述のコードでも説明するが、読み込みたい設定ファイルを明示的に指定するためファイル名は何でも良いと思われます。

余談

https://learn.microsoft.com/ja-jp/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file?view=vs-2022
こちらの公式ドキュメントに沿うよう、.runsettingsファイルを読み込む方法で最初試していました。

結果として

  • Environment.GetEnvironmentVariablesメソッドで環境変数として取り出すことはできた
  • が、それをIFunctionsHostBuilderのコンテキストに埋め込む方法が見つからなかった
  • オブジェクトの設定値を指定したい場合に困った
    という結果に終わった。
    設定ファイルをJSONファイルとし、後述のコードを実装した場合は上手くいった、というのが今回.runsettingsファイルを利用しなかった理由です。

「いや、できるわアホか」と思われた有識者は是非とも教えてください。

実装

https://blog.beachside.dev/entry/2019/05/20/173000
こちらの記事を参考にさせてもらいました。
下記のコードで実際に設定ファイルの内容を読み込み、Functionsを起動することができました。

Startup.cs
using TestTargetFunction;

public class SampleTest
{
    public SampleTest()
    {
        // TestTargetFunctionのStartupクラス
        var startup = new Startup();
        var host = new HostBuilder()
            .ConfigureWebJobs((context, builder) =>
            {
                // 設定ファイルを読んでIConfigurationRootとして生成
                var configuration = new ConfigurationBuilder()
                    .AddJsonFile(path: "appsettings.json")
                    .Build();
                startup.Configure(new WebJobsBuilderContext
                {
                    // WebJobsBuilderContextのコンストラクタ引数に、設定を明示的に指定する
                    Configuration = configuration,
                }
                , builder);
            })
            .Build();
    }
}

コメントにも示している通りですが、要は設定ファイルをロードして、その内容を元にFunctionsを起動してあげてるというだけのことです。
僕は変な設定値を施したらちゃんと落ちることを確認したかったので、テスト用に設定ファイルを個別に設けてます。

たったこれだけのことなのですが、.runsettingsファイルで何とかできないかとか色々試してたらだいぶ手こずりました。
もっとスマートな方法があったらマサカリをよろしくお願いします。

このスクラップは2023/06/16にクローズされました