7

Postępuję zgodnie z tym guide. Mam projekt Startup w projekcie interfejsu API, który używa pliku konfiguracyjnego appsettings.json.AppSettings.json dla testu integracyjnego w środowisku 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(); 
    } 

Poszczególne części, których szukam to env.ContentRootPath. Robiłem pewne kopie dookoła i wygląda na to, że mój appsettings.json nie jest faktycznie skopiowany do folderu bin, ale to jest w porządku, ponieważ ContentRootPath wraca MySolution\src\MyProject.Api\, gdzie znajduje się plik appsettings.json.

Więc w moim projekcie badania integracja mam ten 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); 
    } 

To jest w zasadzie kopiowania i wklejania z prowadnicy. Kiedy debuguję ten test, ContentRootPath jest faktycznie MySolution\src\MyProject.IntegrationTests\bin\Debug\net461\, co jest oczywiście folderem wyjściowym do projektu testowego i ponownie nie ma pliku appsettings.json (tak, mam taki sam plik appsettings.json w samym projekcie testowym), więc test kończy się niepowodzeniem TestServer.

Próbowałem omijać to, modyfikując plik testowy project.json.

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

Mam nadzieję byłoby skopiować plik appsettings.json do katalogu wyjściowego build ale narzeka projektu brakującego do Main metodę punktu wejścia, traktując projekt testowy podobnego projektu konsoli.

Co mogę zrobić, aby ominąć to? czy robię coś źle?

Odpowiedz

4

W końcu podążyłem za tym guide, w szczególności do sekcji Integration Testing w kierunku dolnej części strony. Dzięki temu nie trzeba kopiować pliku appsettings.json do katalogu wyjściowego. Zamiast tego informuje projekt testowy o rzeczywistym katalogu aplikacji internetowej.

Jeśli chodzi o kopiowanie katalogu appsettings.json do katalogu wyjściowego, udało mi się go również uruchomić. W połączeniu z odpowiedzią od Dudu, użyłem zamiast includeFilesinclude tak powstały odcinek będzie wyglądać mniej więcej tak:

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

Nie jestem do końca pewien, dlaczego to działa, ale to robi. Rzuciłem okiem na dokumentację, ale nie mogłem znaleźć żadnych prawdziwych różnic, a ponieważ pierwotny problem został zasadniczo rozwiązany, nie patrzyłem dalej.

+0

Z mojego rozumowania: podczas testu, gdy użyjesz docelowego katalogu głównego jako katalogu głównego i/lub ścieżki podstawowej (zamiast katalogu wyjściowego testu), aplikacja 'Uruchomienie' użyje własnego' appsettings.json', jak podczas pracy poza testami. W takim scenariuszu skopiowanie projektu testowego 'appsettings.json' do jego katalogu wyjściowego nie przyniesie żadnego efektu. Ten plik JSON nie zostanie w ogóle odczytany. Czy to twoje doświadczenie? – superjos

0

Usuń plik "emitEntryPoint": true w pliku testowym project.json.

+0

To pozbyło się błędu o tym, że brakuje 'Main', ale nie skopiowało' appsettings.json' do katalogu 'bin'. –