Питання AppSettings.json для тесту інтеграції в ASP.NET Core


Я дотримуюсь цього путівник. Я маю 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 насправді не скопійовано до 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 метод для точки входу, обробка тестового проекту, як консольний проект.

Що я можу зробити, щоб обійти це? Я робити щось не так?


10
2017-12-29 15:51


походження




Відповіді:


Врешті-решт я пішов за цим путівник, зокрема Тестування інтеграції розділ у нижній частині сторінки. Це виключає необхідність копіювати appsettings.json файл у вихідний каталог. Замість цього тестовий проект називається фактичним каталогом веб-додатки.

Що стосується копіювання appsettings.json до вихідного каталогу мені також вдалося це зробити. Поєднано з відповіддю з дуду, Я використав include замість includeFiles тому результуючий розділ виглядатиме так:

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

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


8
2018-01-26 17:01



З мого розуміння: під час тесту, коли ви використовуєте корінь цільової програми як root та / або базовий шлях (замість тестової вихідної директорії), ваша заявка Startup буде використовувати свою власну appsettings.json, як при роботі поза тестами. У такому сценарії копіювання тестового проекту appsettings.json до його вихідного каталогу не буде мати ефекту. Цей файл json не буде читати взагалі. Це ваш досвід? - superjos
Як це зробити у .NET.Core 2.0? в project.json був непрацездатним. - John_J


Тест інтеграції на ASP.NET.Core 2.0 слідуйте MS керівництво ,

Ви повинні клацнути правою кнопкою миші appsettings.json встановити його властивість Copy to Output directory до Копіювати завжди

І тепер ви можете знайти 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 в ASP.NET Core 2.0, але він працював на 1.1


3
2018-05-29 10:11





Видалити "emitEntryPoint": true в тесті project.json файл


1
2018-01-18 09:02



Той, що позбувся помилки, про неї відсутній Main але він не скопіював appsettings.json в bin каталог - Kevin Lee