web-dev-qa-db-ja.com

ASP.NET Core 1.0 RC2のxunitクラスライブラリのappsettings.jsonからConfigurationBuilderを読み取れない

XUnitプロジェクトで次のことを実行して、テストで使用するデータベースへの接続文字列を取得しようとしています。

public class TestFixture : IDisposable
{
    public IConfigurationRoot Configuration { get; set; }
    public MyFixture()
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
        Configuration = builder.Build();
    }

    public void Dispose()
    {    
    }
}

Startup.csで使用すると、WebAPIおよびMVCテンプレートで完全に機能するため、非常に奇妙です。さらに、このコードは以前はdnxを使用してRC1で機能していましたが、すべてをRC2およびCore CLIに更新したため、xunitクラスライブラリのルートにあるappsettings.jsonファイルを見つけることができなくなりました。

ここに私のテストクラスがどのように見えるかですので、私がどのように設定を求めているかを見ることができます:

public class MyTests : IClassFixture<MyFixture>
{
    private readonly MyFixture _fixture;
    public MyTests(MyFixture fixture)
    {
        this._fixture = fixture;
    }

    [Fact]
    public void TestCase1()
    {
        ICarRepository carRepository = new CarRepository(_fixture.Configuration);
    }
}
15
Blake Rivell

これは簡単な問題です。appsetting.jsonxunitプロジェクトの下に存在する必要があります。または、他のプロジェクトのappsettings.jsonが存在する場所を指す相対パスを使用する必要があります。

public class TestFixture : IDisposable
{
    public IConfigurationRoot Configuration { get; set; }
    public MyFixture()
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("../../OtherProj/src/OtherProj/appsettings.json", 
                         optional: true, reloadOnChange: true);
        Configuration = builder.Build();
    }

    public void Dispose() {  }
}

理想的には、テストプロジェクトのローカルに独自の構成ファイルを置くだけです。私のASP.NET Core RC2データベーステストプロジェクトでは、フィクスチャは次のようになります。

public DatabaseFixture()
{
    var builder =
        new ConfigurationBuilder()
            .AddJsonFile("testsettings.json")
            .AddEnvironmentVariables();
   // Omitted...
}

ここで、testsettings.jsonはプロジェクト固有のテスト固有の構成です。

更新

project.jsonで、appsettings.jsoncopyToOutputとしてマークしていることを確認してください。詳細は スキーマストア を参照してください。

"buildOptions": {
  "copyToOutput": {
    "include": [ "appsettings.json" ]
  }
},
20
David Pine

@DavidPineの回答の詳細情報を追加するには

どういうわけか相対パスは私にはうまくいかないので、ここに私がそれをする方法があります。

var builder = new ConfigurationBuilder()
.SetBasePath(Path.GetFullPath(@"../XXXX")).AddJsonFile("appsettings.json");

私のは.net core 1.0.0-preview1-002702です

4
maxisam