Параметр appsettings.JSON для интеграционного теста в ASP.NET Керн

Я после этого руководство. У меня есть Startup в проекте API, который использует 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 фактически не копируется в есть.

Итак, в моем тестовом проекте интеграции у меня есть это тест:

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 на самом деле MySolutionsrcMyProject.IntegrationTestsbinDebugnet461, который, очевидно, является выходной папкой сборки для тестового проекта и снова appsettings.json файла нет (да, у меня есть другой appsettings.json файл в самом тестовом проекте) , поэтому тест не удается создать TestServer.

Я попытался обойти это, изменив тест .

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

Я надеялся, что это будет копировать appsettings.json файл в выходной каталог сборки, но он жалуется на отсутствие проекта Main способ для точки входа, рассматривая тестовый проект как консольный проект.

что я могу сделать, чтобы обойти это? Я делаю что-то не так?

3 ответов


в конце концов, я следовал этому руководство, в частности Интеграционное Тестирование в нижней части страницы. Это устраняет необходимость копирования appsettings.json файл в выходной каталог. Вместо этого он сообщает тестовому проекту фактический каталог веб-приложения.

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

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

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


интеграционного тестирования on ASP.Сеть.Core 2.0 соблюдать MS guide ,

вы должны щелкнуть правой кнопкой мыши appsettings.json установите его свойство Copy to Output directory to копия всегда

и теперь вы можете найти файл json в выходной папке и построить TestServer С

var projectDir = System.IO.Directory.GetCurrentDirectory();
_server = new TestServer(new WebHostBuilder()
    .UseEnvironment("Development")
    .UseContentRoot(projectDir)
    .UseConfiguration(new ConfigurationBuilder()
        .SetBasePath(projectDir)
        .AddJsonFile("appsettings.json")
        .Build()
    )
    .UseStartup<TestStartup>());

Ref:TestServer w / WebHostBuilder не читает appsettings.json on ASP.NET Core 2.0, но он работал на 1.1


удалить "emitEntryPoint": true тест .