7

Ich bin dieser guide folgen. Ich habe eine Startup in dem API-Projekt, das eine appsettings.json Konfigurationsdatei verwendet.AppSettings.json für Integration Test in ASP.NET Core

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(); 
    } 

Der besondere Teil, den ich betrachte, ist die env.ContentRootPath. Ich habe etwas graben herum und es sieht aus wie meine appsettings.json ist nicht tatsächlich in die bin Ordner kopiert, aber das ist in Ordnung, wie ContentRootPathMySolution\src\MyProject.Api\ zurückgibt, wo sich die appsettings.json Datei befindet.

Also in meinem Integrationstestprojekt habe ich diesen Test:

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); 
    } 

Diese im Grunde kopieren und einfügen von der Führung. Wenn ich diesen Test debugge, ist ContentRootPath eigentlich MySolution\src\MyProject.IntegrationTests\bin\Debug\net461\, die offensichtlich der Build-Ausgabeordner für das Testprojekt ist und wieder die appsettings.json Datei ist nicht da (ja ich habe eine andere appsettings.json Datei im Testprojekt selbst), so dass der Test bei der Erstellung fehlschlägt die TestServer.

Ich habe versucht, dies zu umgehen, indem Sie den Test project.json Datei ändern.

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

Ich hoffte, dass dies die appsettings.json Datei in den Build-Ausgabeverzeichnis kopiert werden würde, aber es beschwert sich über das Projekt ein Main Verfahren für einen Einstiegspunkt fehlt, wie ein Konsolenprojekt das Testprojekt zu behandeln.

Was kann ich tun, um dies zu umgehen? Mache ich etwas falsch?

Antwort

4

Am Ende folgte ich diesem guide, speziell die Integration Testing Abschnitt auf der Unterseite der Seite. Dadurch entfällt die Notwendigkeit, die Datei appsettings.json in das Ausgabeverzeichnis zu kopieren. Stattdessen teilt es dem Testprojekt das tatsächliche Verzeichnis der Webanwendung mit.

Zum Kopieren der appsettings.json in das Ausgabeverzeichnis, ich habe es auch geschafft, das zu arbeiten. In Kombination mit der Antwort von Dudu, benutzen ich include statt includeFiles so der resultierende Abschnitt in etwa so aussehen würde:

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

Ich bin nicht ganz sicher, warum dies funktioniert, aber es funktioniert. Ich habe mir die Dokumentation kurz angeschaut, konnte aber keine wirklichen Unterschiede feststellen und da das ursprüngliche Problem im Wesentlichen gelöst war, habe ich nicht weiter gesucht.

+0

Aus meinem Verständnis: Während des Tests, wenn Sie die Ziel-Anwendung root als Content-Root-und/oder Basis-Pfad (anstelle des Test-Output-Verzeichnis) verwenden, wird Ihre Anwendung 'Startup' eigene 'appsettings.json' verwenden, wie beim Ausführen außerhalb von Tests. In einem solchen Szenario hat das Kopieren des Testprojekts 'appsettings.json' in sein Ausgabeverzeichnis keine Auswirkungen. Diese JSON-Datei wird überhaupt nicht gelesen. Ist das deine Erfahrung? – superjos

0

Entfernen "emitEntryPoint": true in Test project.json Datei.

+0

Das wurde der Fehler über das Fehlen eines "Main" los, aber es kopiert nicht die 'appsettings.json' in das' bin'-Verzeichnis. –

Verwandte Themen