无法让ConfigurationBuilder在ASP.NET Core 1.0 RC2的xunit类库中读取appsettings.json

15

我正在尝试在一个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()
    {    
    }
}

当在Startup.cs中使用时,它可以在WebAPI和MVC模板中完美运行,这非常奇怪。此外,此代码先前在dnx中正常工作,但现在我将所有内容更新到RC2和Core CLI后,它无法找到位于xunit类库根目录中的appsettings.json文件。

以下是我的测试类的样子,您可以看到我如何调用配置:

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);
    }
}
2个回答

20

这是一个简单的问题,您需要确保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数据库测试项目中,我的fixture看起来像这样:

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

“testsettings.json”是项目本地的测试专用配置文件。

更新

在你的“project.json”文件中,确保将“appsettings.json”标记为“copyToOutput”。有关详情,请参阅模式存储

"buildOptions": {
  "copyToOutput": {
    "include": [ "appsettings.json" ]
  }
},

也许我的问题是其他的原因,因为我的appsettings.json文件在我的xunit项目的根目录中。我在帖子中说过:“它不再能够找到位于xunit类库根目录中的appsettings.json文件。”自从我切换到新的RC2模板后,它就开始失败了。如果您不介意,您的project.json文件中安装了哪些软件包,以便拥有您粘贴的代码行。我想确保我正在使用相同的软件包。 - Blake Rivell
我在新的xunit文档中读到了有关构建选项设置的内容,但没有意识到还需要对appsettings.json进行设置。如果您能向我展示如何操作,那将非常棒。 - Blake Rivell
谢谢!最后一个问题:当从类库引用IConfigurationRoot时,您使用Microsoft.Extensions.Configuration还是Microsoft.Extensions.Configuration.Abstractions?两者似乎都可以。 - Blake Rivell
是的,你应该同时使用两者。一个是有用的扩展方法,另一个是类型的抽象化。 - David Pine
更新(copyToOutput)终于让我能够读取我的强类型选项中的*setings.json文件。就我所知,这是唯一提到此步骤的地方。 - leon

7

为了补充 @DavidPine 的答案,我希望提供更多信息。

不知道为什么相对路径对我不起作用,所以这里是我如何做到的。

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

我的是 .net core 1.0.0-preview1-002702 版本


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接