NUnitでテスト対象.NETプロジェクトのConfigをDIする
テストプロジェクトでテスト対象プロジェクトの設定をそのまま使用したい。
でもappsettings.jsonを丸ごとコピーとか、あれこれコードを増やしたくない・・・
そんな怠惰な自分にピッタリな方法を今更ながら備忘録的に残しておく。
IConfigurationなプロパティを作る
テストプロジェクトのSetUpでAddSingletonとかする時用にプロパティにしておく
public class Tests
{
public IConfiguration Configuration
{
get
{
var configBuilder = new ConfigurationBuilder()
.SetBasePath("参照したいjsonがあるパス")
.AddJsonFile("appsettings.json")
.AddJsonFile("appsettings.Development.json");
// Buildでconfigのインスタンスが返せる
return configBuilder.Build();
}
}
}
.SetBasePath
でjsonのある場所を指定することと、.AddJsonFile("appsettings.json")
と.AddJsonFile("appsettings.Development.json")
で、分割してあるファイル分Addするのがポイント。
.AddUserSecrets("ユーザーシークレットのID")
を足せばユーザーシークレットで管理している値も使用できる。
作成したプロパティでDI
SetUpなメソッドでAddSingletonなりなんなりするだけ
public class Tests
{
[SetUp]
public void Setup()
{
var services = new ServiceCollection();
services.AddSingleton<IConfiguration>(Configuration);
services.AddSingleton<IDbContext, DbContext>();
}
}
ちなみに、DbContextの中身を・・・
private readonly IConfiguration _configuration;
private readonly string _connectionString;
public DbContext(IConfiguration configuration)
{
_configuration = configuration;
_connectionString = _configuration.GetConnectionString("key");
}
public IDbConnection CreateConnection() => new SqlConnection(_connectionString);
などとしておくとDapperでConnectionするのが楽