7

私はこれに従いますguide。私はStartupappsettings.json設定ファイルを使用するAPIプロジェクトに持っています。ASP.NETコアでの統合テストのAppSettings.json

public class Startup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)     
      .AddEnvironmentVariables(); 
     Configuration = builder.Build(); 

     Log.Logger = new LoggerConfiguration() 
      .Enrich.FromLogContext() 
      .ReadFrom.Configuration(Configuration) 
      .CreateLogger(); 
    } 

私が見ている特定の部分はenv.ContentRootPathです。私は掘り出し物をいくつか掘り下げましたが、appsettings.jsonは実際にbinフォルダにコピーされていませんが、ContentRootPathappsettings.jsonファイルがあるMySolution\src\MyProject.Api\を返しているので問題ありません。

public class TestShould 
{ 
    private readonly TestServer _server; 
    private readonly HttpClient _client; 

    public TestShould() 
    { 
     _server = new TestServer(new WebHostBuilder().UseStartup<Startup>()); 
     _client = _server.CreateClient(); 
    } 

    [Fact] 
    public async Task ReturnSuccessful() 
    { 
     var response = await _client.GetAsync("/monitoring/test"); 
     response.EnsureSuccessStatusCode(); 

     var responseString = await response.Content.ReadAsStringAsync(); 

     Assert.Equal("Successful", responseString); 
    } 

これは基本的にガイドからコピー&ペーストされます。

は、だから私の統合テストプロジェクトで、私はこのテストを持っています。このテストをデバッグするとき、 ContentRootPathは実際には MySolution\src\MyProject.IntegrationTests\bin\Debug\net461\です。明らかにテストプロジェクトのビルド出力フォルダです。 appsettings.jsonファイルはありません(テストプロジェクト自体に別の appsettings.jsonファイルがあります)。 TestServer

テストproject.jsonファイルを変更してこの問題を回避しようとしました。

"buildOptions": { 
    "emitEntryPoint": true, 
    "copyToOutput": { 
     "includeFiles": [ 
      "appsettings.json" 
     ] 
    } 
} 

私は、これは、ビルド出力ディレクトリにappsettings.jsonファイルをコピーすることを望んだが、それは、エントリポイントのMain方法が欠落したプロジェクトを訴え、コンソールプロジェクトのようなテストプロジェクトを処理します。

これを回避するにはどうすればよいですか?私は何か間違っているのですか?

答えて

4

最後に、私はこのguide、特に統合テストセクションをページの下部に向かって追跡しました。これにより、appsettings.jsonファイルを出力ディレクトリにコピーする必要がなくなります。代わりに、テストプロジェクトにWebアプリケーションの実際のディレクトリを伝えます。

appsettings.jsonを出力ディレクトリにコピーしても、それを動作させることができました。

"buildOptions": { 
    "copyToOutput": { 
     "include": "appsettings.json" 
    } 
} 

私は、これは動作しますが、それがない理由は全くわからない:ドゥドゥからの回答と合わせると、私はそう結果のセクションでは、このようになりますinclude代わりのincludeFilesを使用しました。私はドキュメントをすばやく見ていましたが、実際の違いは見つかりませんでした。元々の問題は本質的に解決されて以来、私はそれ以上見ていませんでした。

+0

私が理解しているように、テスト中に、ターゲットのアプリケーションルートを(テスト出力ディレクトリの代わりに)コンテンツルートおよび/またはベースパスとして使用すると、アプリケーションの 'Startup'は実行時と同じように' appsettings.json'を使用しますテストの外。このようなシナリオでは、テストプロジェクト 'appsettings.json'を出力ディレクトリにコピーすることは効果がありません。そのjsonファイルはまったく読み込まれません。それはあなたの経験ですか? – superjos

0

テストproject.jsonファイルの​​を削除します。

+0

これは、 'Main'が見つからないというエラーを取り除きましたが、' appsettings.json'を 'bin'ディレクトリにコピーしませんでした。 –

関連する問題