Параметр 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