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