AppSettings.json用于ASP.NET核心中的集成测试

时间:2016-12-29 15:51:12

标签: c# configuration asp.net-core integration-testing appsettings

我正在关注此guide。我在API项目中有Startup使用appsettings.json配置文件。

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)                
            .AddEnvironmentVariables();
        Configuration = builder.Build();

        Log.Logger = new LoggerConfiguration()
            .Enrich.FromLogContext()
            .ReadFrom.Configuration(Configuration)
            .CreateLogger();
    }

我正在看的特定部分是env.ContentRootPath。我做了一些挖掘,看起来我的appsettings.json实际上没有被复制到bin文件夹,但这很好,因为ContentRootPath正在返回MySolution\src\MyProject.Api\,这是appsettings.json文件位于。

所以在我的集成测试项目中,我有这个测试:

public class TestShould
{
    private readonly TestServer _server;
    private readonly HttpClient _client;

    public TestShould()
    {
        _server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
        _client = _server.CreateClient();
    }

    [Fact]
    public async Task ReturnSuccessful()
    {
        var response = await _client.GetAsync("/monitoring/test");
        response.EnsureSuccessStatusCode();

        var responseString = await response.Content.ReadAsStringAsync();

        Assert.Equal("Successful", responseString);
    }

这基本上是指南中的复制和粘贴。当我调试此测试时,ContentRootPath实际上是MySolution\src\MyProject.IntegrationTests\bin\Debug\net461\,这显然是测试项目的构建输出文件夹,并且appsettings.json文件不再存在(是的,我确实有另一个appsettings.json 1}}测试项目本身的文件)因此测试在创建TestServer时失败。

我尝试通过修改测试project.json文件来解决这个问题。

"buildOptions": {
    "emitEntryPoint": true,
    "copyToOutput": {
        "includeFiles": [
            "appsettings.json"
       ]
    }
}

我希望这会将appsettings.json文件复制到构建输出目录,但它抱怨项目缺少入口点的Main方法,将测试项目视为控制台项目。

我该怎么做才能解决这个问题?我做错了吗?

3 个答案:

答案 0 :(得分:13)

ASP.NET.Core 2.0 上的

集成测试关注MS guide

您应该右键点击appsettings.json将其属性Copy to Output directory设置为始终复制

现在您可以在输出文件夹中找到json文件,并使用

构建TestServer
var projectDir = System.IO.Directory.GetCurrentDirectory();
_server = new TestServer(new WebHostBuilder()
    .UseEnvironment("Development")
    .UseContentRoot(projectDir)
    .UseConfiguration(new ConfigurationBuilder()
        .SetBasePath(projectDir)
        .AddJsonFile("appsettings.json")
        .Build()
    )
    .UseStartup<TestStartup>());

参考:TestServer w/ WebHostBuilder doesn't read appsettings.json on ASP.NET Core 2.0, but it worked on 1.1

答案 1 :(得分:8)

最后,我将此guide,特别是集成测试部分放在页面底部。这样就无需将appsettings.json文件复制到输出目录。相反,它告诉测试项目Web应用程序的实际目录。

至于将appsettings.json复制到输出目录,我还设法让它工作。结合 dudu 的答案,我使用include代替includeFiles,因此结果部分看起来像这样:

"buildOptions": {
    "copyToOutput": {
        "include": "appsettings.json"
    }
}

我不完全确定为什么会这样,但确实如此。我快速查看了文档,但找不到任何真正的差异,因为原来的问题基本上已经解决了,所以我没有进一步了解。

答案 2 :(得分:1)

删除测试"emitEntryPoint": true文件中的project.json