Я создаю интеграционные тесты ASP.NET Core (на основе xUnit), следуя этим документам .Я хочу запустить тестовый веб-сервер с собственным appsettings.json
.Моя сокращенная структура папок:
\SampleAspNetWithEfCore
\SampleAspNetWithEfCore\SampleAspNetWithEfCore.csproj
\SampleAspNetWithEfCore\Startup.cs
\SampleAspNetWithEfCore\appsettings.json
\SampleAspNetWithEfCore\Controllers\*
\SampleAspNetWithEfCore.Tests\SampleAspNetWithEfCore.Tests.csproj
\SampleAspNetWithEfCore.Tests\IntegrationTests.cs
\SampleAspNetWithEfCore.Tests\appsettings.json
, тогда у меня есть эти утилиты:
public static class ServicesExtensions
{
public static T AddOptions<T>(this IServiceCollection services, IConfigurationSection section)
where T : class, new()
{
services.Configure<T>(section);
services.AddSingleton(provider => provider.GetRequiredService<IOptions<T>>().Value);
return section.Get<T>();
}
}
и внутри Startup.cs
ConfigureServices(...)
Я делаю это:
services.AddOptions<SystemOptions>(Configuration.GetSection("System"));
Обратимся к разделу appsettings.json
следующим образом:
"System": {
"PingMessageSuffix": " suffix-from-actual-project"
}
Пока все хорошо: это подобрано строго типизированным способом. Мой контроллер получает экземпляр SystemOptions
, которыйотражает структуру json, и контроллер правильно использует суффикс.
Проблемы заключаются в построении интеграционных тестов WebHost .Я хочу запустить Startup
из моего реального проекта как есть, с его собственными настройками appsettings.json
, но в качестве дополнительного слоя настроек я хочу добавить appsettings.json
из моего тестового csproj ,переопределение любых настроек, если применимо.Это мои appsettings из тестового проекта:
"System": {
"PingMessageSuffix": " suffix-from-test-appsettings"
}
Вот что я попробовал:
public class CustomWebApplicationFactory : WebApplicationFactory<Startup>
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder
.UseStartup<Startup>()
.ConfigureAppConfiguration(config => config
.AddJsonFile("appsettings.json")
);
}
}
Однако это не работает.Если я достиг точки останова в моем контроллере, я вижу только настройки из базового проекта.В настоящий момент контроллер просто отображает значение конфигурации, и логически результат возврата также не соответствует ожидаемому.
Документация нигде на странице не упоминает "appsettings".
Итог : Как добавить слой appSettings из файла appsettings.json тестового проекта при запуске интеграционных тестов ASP.NET Core?