Не удалось заставить ConfigurationBuilder читать из appsettings.json в библиотеке классов xunit в ASP.NET Core 1.0 RC2

Я пытаюсь сделать следующее в проекте XUnit, чтобы получить строку подключения к базе данных, которую должны использовать мои тесты:

public class TestFixture : IDisposable
{
    public IConfigurationRoot Configuration { get; set; }
    public MyFixture()
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
        Configuration = builder.Build();
    }

    public void Dispose()
    {    
    }
}

Это очень странно, потому что он отлично работает в шаблонах WebAPI и MVC при использовании в Startup.cs. Кроме того, этот код ранее работал в RC1 с dnx, но теперь, когда я обновил все до RC2 и Core CLI, он больше не может найти файл appsettings.json, который находится в корне библиотеки классов xunit.

Вот как выглядит мой тестовый класс, чтобы вы могли видеть, как я вызываю конфигурацию:

public class MyTests : IClassFixture<MyFixture>
{
    private readonly MyFixture _fixture;
    public MyTests(MyFixture fixture)
    {
        this._fixture = fixture;
    }

    [Fact]
    public void TestCase1()
    {
        ICarRepository carRepository = new CarRepository(_fixture.Configuration);
    }
}

person Blake Rivell    schedule 27.05.2016    source источник


Ответы (2)


Это простая проблема, вам нужно, чтобы appsetting.json также существовал в проекте xunit. Или вам нужно использовать относительный путь, указывающий, где appsettings.json существует в другом проекте.

public class TestFixture : IDisposable
{
    public IConfigurationRoot Configuration { get; set; }
    public MyFixture()
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("../../OtherProj/src/OtherProj/appsettings.json", 
                         optional: true, reloadOnChange: true);
        Configuration = builder.Build();
    }

    public void Dispose() {  }
}

В идеале у вас просто должен быть собственный файл конфигурации, локальный для тестового проекта. В моем тестовом проекте базы данных ASP.NET Core RC2 мое приспособление выглядит следующим образом:

public DatabaseFixture()
{
    var builder =
        new ConfigurationBuilder()
            .AddJsonFile("testsettings.json")
            .AddEnvironmentVariables();
   // Omitted...
}

Где testsettings.json — это специфичная для теста конфигурация, локальная для проекта.

Обновить

В своем project.json убедитесь, что вы отмечаете appsettings.json как copyToOutput. Подробнее см. в хранилище схем.

"buildOptions": {
  "copyToOutput": {
    "include": [ "appsettings.json" ]
  }
},
person David Pine    schedule 27.05.2016
comment
Возможно, моя проблема заключается в чем-то другом, потому что мой appsettings.json находится в корне моего проекта xunit. Я сказал это в своем сообщении: «он больше не может найти файл appsettings.json, который находится в корне библиотеки классов xunit». С тех пор, как я переключился на новый шаблон RC2, он начал давать сбой. Какие пакеты вы установили в свой файл project.json, если вы не возражаете, если я спрошу, чтобы вставить строку кода, которую вы вставили. Я хочу убедиться, что использую одни и те же. - person Blake Rivell; 27.05.2016
comment
Я прочитал о настройке параметров сборки в новых документах xunit, но не понял, что это нужно сделать и для appsettings.json. Да, было бы замечательно, если бы вы могли показать мне, как это сделать. - person Blake Rivell; 27.05.2016
comment
Спасибо! Последний вопрос: используете ли вы Microsoft.Extensions.Configuration или Microsoft.Extensions.Configuration.Abstractions при ссылке на IConfigurationRoot из библиотеки классов. Оба, кажется, работают. - person Blake Rivell; 27.05.2016
comment
Да, вы должны использовать оба. Один из них — это полезные методы расширения, а другой — абстракция типов. - person David Pine; 27.05.2016
comment
Обновление (copyToOutput) позволило мне, наконец, прочитать файлы *settings.json, которые у меня есть, в мои строго типизированные параметры. Насколько я вижу, это единственное место, где упоминается этот шаг. - person leon; 20.07.2016

Чтобы добавить дополнительную информацию для ответа @DavidPine

Почему-то относительный путь не работает для меня, так что вот как я это делаю.

var builder = new ConfigurationBuilder()
.SetBasePath(Path.GetFullPath(@"../XXXX")).AddJsonFile("appsettings.json");

У меня ядро ​​.net 1.0.0-preview1-002702

person maxisam    schedule 03.06.2016