У меня есть проект модульного тестирования .Net 8.0. Этот проект является частью решения, которое также содержит проекты приложений.
В рамках тестовой настройки используется ConfigurationBuilder.
var configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("appsettings.json", optional: true);
var configuration = configurationBuilder.Build();
При повторном запуске тестов конфигурация загружает (неправильный) файл appSettings.json из проекта приложения, в следующий раз — (правильный) файл appSettings.json из тестового проекта, затем снова неправильный файл, затем снова правильный файл и т. д. .
Файл приложения appSettings.json не содержит параметра, необходимого в тестовом проекте.
Я попробовал несколько решений, чтобы ConfigurationBuilder постоянно загружал правильный файл настроек.
Все вышеперечисленные методы не решают проблему. Мой вопрос: почему ConfigurationBuilder чередует два файла appSettings.json? Как я могу помешать ему это сделать?

у меня есть несколько вопросов
Папка вывода ваших проектов одинакова? Если да, можете ли вы заменить тестовый файл appsettings.json на appsettings.test.json и т. д.
ТестПроект.csproj
<ItemGroup>
<None Update = "appsettings.test.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
АгентТест.cs
public class AgentTests : BaseTest
{
static IConfiguration Configuration {get; set;}
public AgentTests() : base(false)
{
}
[SetUp]
public void Setup()
{
Configuration = new ConfigurationBuilder().AddJsonFile("appsettings.test.json").Build();
}
[Test]
public async Task Can_Get_AgentById()
{
// Arrange
int agentId = 350;
IAgentRepository agentRepo = new AgentService(Configuration);
// Act
var result = await agentRepo.GetAgentById(agentId);
// Assert
Assert.That(result is not null);
}
}
Я могу использовать вот так.
Дайте мне более подробную информацию, если этот ответ не охватывает вашу проблему.
Я могу подумать о нескольких вещах. Является ли ваша тестовая среда Linux-машиной? Если да, то давайте убедимся, что мы вводим правильную строку при указании абсолютного пути. Проблема обратной или прямой косой черты в разнице Linux/Windows (можно использовать Path.DirectorySeparatorChar). Также нет проблем дать корневой файл, поскольку запуск программы происходит из папки bin/Debug/.Net8.0/. И можете ли вы протестировать построитель конфигурации, добавив метод расширения json с помощью '.AddJsonFile("appsettings.json", необязательно: false)'. Поэтому удаляйте настройки приложения по одному, проверяйте, какой из них не найден, когда вы его удаляете.
Сейчас я запускаю тест вручную в VisualStudio 2022 на компьютере с Windows 11. В appSettings.json в проекте приложения было CopyToOutputDirectory = CopyAlways. В тестовом проекте для него было установлено значение CopyIfNewer. Я изменил это на CopyAlways, но, к сожалению, это не решает проблему. Я попробую ваше предложение изменить имя файла.
Изменение имени файла на appSettings.test.json, похоже, решает проблему. Но это не объясняет, почему возникла проблема.
Круто, я почти уверен, что где-то переопределен ваш appsettings.json. В вашей выходной папке есть 2 приложения?
Да. Теперь есть файл appSettings.test.json (содержащий настройки теста) и файл appSettings.Development.json. В нем содержатся настройки из приложения. Вероятно, это переопределяло appSettings.json из теста. Но почему это происходило только при каждом втором запуске тестов?
Пути вывода проектов различны. Я проверил источник в ConfigurationBuilder. У него есть FileProvider, содержащий правильный путь. Я проверил этот путь, файл appSettings.json находится там и содержит правильные настройки. Но в следующий раз, когда я запустил тест, все настройки были такими же, но сам файл содержал настройки проекта приложения, а не настройки тестового проекта. Таким образом, причина проблемы, по-видимому, заключается в копировании файла из исходного каталога проекта в выходной каталог (bin\Debug\net8.0).