Подтвердить что ты не робот

Не удалось получить 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);
    }
}
4b9b3361

Ответ 1

Это простая проблема, вам нужно, чтобы 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" ]
  }
},

Ответ 2

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

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

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

Mine is.net core 1.0.0-preview1-002702