ConfigurationBuilder.AddJsonFile каждый раз использует неправильный файл json

У меня есть проект модульного тестирования .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 постоянно загружал правильный файл настроек.

  • Создание PhysicalFileProvider и использование ConfigurationBuilder.SetFileProvider
  • Создание PhysicalFileProvider и указание этого при вызове AddJsonFile
  • Использование SetBaseDirectory

Все вышеперечисленные методы не решают проблему. Мой вопрос: почему ConfigurationBuilder чередует два файла appSettings.json? Как я могу помешать ему это сделать?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
224
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

у меня есть несколько вопросов

Папка вывода ваших проектов одинакова? Если да, можете ли вы заменить тестовый файл 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);
   }
}

Я могу использовать вот так.

Дайте мне более подробную информацию, если этот ответ не охватывает вашу проблему.

Пути вывода проектов различны. Я проверил источник в ConfigurationBuilder. У него есть FileProvider, содержащий правильный путь. Я проверил этот путь, файл appSettings.json находится там и содержит правильные настройки. Но в следующий раз, когда я запустил тест, все настройки были такими же, но сам файл содержал настройки проекта приложения, а не настройки тестового проекта. Таким образом, причина проблемы, по-видимому, заключается в копировании файла из исходного каталога проекта в выходной каталог (bin\Debug\net8.0).

George 26.03.2024 14:51

Я могу подумать о нескольких вещах. Является ли ваша тестовая среда Linux-машиной? Если да, то давайте убедимся, что мы вводим правильную строку при указании абсолютного пути. Проблема обратной или прямой косой черты в разнице Linux/Windows (можно использовать Path.DirectorySeparatorChar). Также нет проблем дать корневой файл, поскольку запуск программы происходит из папки bin/Debug/.Net8.0/. И можете ли вы протестировать построитель конфигурации, добавив метод расширения json с помощью '.AddJsonFile("appsettings.json", необязательно: false)'. Поэтому удаляйте настройки приложения по одному, проверяйте, какой из них не найден, когда вы его удаляете.

Unseen 26.03.2024 15:00

Сейчас я запускаю тест вручную в VisualStudio 2022 на компьютере с Windows 11. В appSettings.json в проекте приложения было CopyToOutputDirectory = CopyAlways. В тестовом проекте для него было установлено значение CopyIfNewer. Я изменил это на CopyAlways, но, к сожалению, это не решает проблему. Я попробую ваше предложение изменить имя файла.

George 26.03.2024 15:02

Изменение имени файла на appSettings.test.json, похоже, решает проблему. Но это не объясняет, почему возникла проблема.

George 26.03.2024 15:04

Круто, я почти уверен, что где-то переопределен ваш appsettings.json. В вашей выходной папке есть 2 приложения?

Unseen 26.03.2024 15:08

Да. Теперь есть файл appSettings.test.json (содержащий настройки теста) и файл appSettings.Development.json. В нем содержатся настройки из приложения. Вероятно, это переопределяло appSettings.json из теста. Но почему это происходило только при каждом втором запуске тестов?

George 26.03.2024 16:13

Другие вопросы по теме