7

Я следую за этим guide. У меня есть проект Startup в проекте API, в котором используется файл конфигурации appsettings.json.AppSettings.json для теста интеграции в 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(); 
    } 

Особая часть, на которую я смотрю, - env.ContentRootPath. Я сделал несколько копаний, и похоже, что мой appsettings.json на самом деле не скопирован в папку bin, но это нормально, так как ContentRootPath возвращает MySolution\src\MyProject.Api\, где находится файл appsettings.json.

Так что в моей тестовой интеграции проекта у меня есть этот тест:

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 в выходной каталог. Вместо этого он сообщает тестовому проекту фактический каталог веб-приложения.

Что касается копирования appsettings.json в выходной каталог, мне также удалось заставить его работать. В сочетании с ответом от дуду, я использовал include вместо includeFiles поэтому результирующий раздел будет выглядеть примерно так:

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

Я не совсем уверен, почему это работает, но это делает. Я быстро просмотрел документацию, но не смог найти никаких реальных различий, и поскольку исходная проблема была по существу решена, я не смотрел дальше.

+0

С моей точки зрения: во время теста, когда вы используете корень целевого приложения как корневой каталог контента и/или базовый путь (вместо тестового выходного каталога), ваше приложение 'Startup' будет использовать свой собственный' appsettings.json', как при запуске вне испытаний. В таком случае копирование тестового проекта 'appsettings.json' в его выходной каталог не будет иметь никакого эффекта. Этот json-файл не будет прочитан вообще. Это ваш опыт? – superjos

0

Удалить "emitEntryPoint": true in test project.json файл.

+0

Это избавило от ошибки об отсутствии «Main», но не скопировало 'appsettings.json' в каталог' bin'. –