在测试项目中使用 ASP.NET Core 的 ConfigurationBuilder

Posted

技术标签:

【中文标题】在测试项目中使用 ASP.NET Core 的 ConfigurationBuilder【英文标题】:Using ASP.NET Core's ConfigurationBuilder in a Test Project 【发布时间】:2016-04-29 16:38:39 【问题描述】:

我想在我的功能测试项目中使用IHostingEnvironmentConfigurationBuilder,以便根据环境使用不同的配置运行功能测试。我想使用下面的代码:

public IConfigurationRoot ConfigureConfiguration(IHostingEnvironment hostingEnvironment)

    var builder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.hostingEnvironment.EnvironmentName.json", true)
        .AddEnvironmentVariables();
    return builder.Build();

我想要一个 appSettings.jsonappSettings.Production.json 文件来将我的功能测试指向生产。这可能吗?如何实现?我需要一个IHostingEnvironment 的实例。

【问题讨论】:

【参考方案1】:

您可以通过几个步骤在测试项目中使用ConfigurationBuilder。我认为您不需要IHostingEnvironment 接口本身。

首先,将两个具有ConfigurationBuilder 扩展方法的 NuGet 包添加到您的项目中:

"dependencies": 
  "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc1-final",
  "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final"

其次,将你想要的环境变量放入测试项目的属性中:

然后就可以在测试项目中创建自己的builder了:

private readonly IConfigurationRoot _configuration;

public BuildConfig()

    var environmentName = Environment.GetEnvironmentVariable("Hosting:Environment");

    var config = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.environmentName.json", true)
        .AddEnvironmentVariables();

    _configuration = config.Build();

如果您想使用完全相同的设置文件(而不是副本),则需要为其添加路径。

【讨论】:

我的测试项目完全忽略了我设置的任何配置;即使我从测试类中删除了对它的所有引用,它仍在运行我的主项目的Startup。我想不通。 :// 我遇到了与@vaindil 相同的问题,并在此处的回答中描述了对我有用的方法:***.com/a/54878482/190476【参考方案2】:

为了完整起见,我将在此处添加此答案,因为我遇到了与 @vaindil 在 Will 的答案 here 中描述的相同的问题。原因是我们从被测代码中的环境变量中填充了 IConfiguration。这会覆盖我们在测试中使用 appsettings.json 设置的任何配置。 我们的解决方案是使用System.Environment.SetEnvironvironmentVariable("variableName", "variableValue") 为测试过程创建环境变量

实际上,我们测试中的 WebHostBuilder 实例的创建方式与我们托管的 API 相同:

// Code omitted for brevity
var builder = new WebHostBuilder()                 
                .UseEnvironment("Development")
                .ConfigureAppConfiguration(configurationBuilder => configurationBuilder.AddEnvironmentVariables())
                .UseStartup<Startup>();

var testServer = new TestServer(builder); // test against this

【讨论】:

【参考方案3】:

这是可能的,根据 ASP.NET Core 文档 (http://docs.asp.net/en/latest/fundamentals/configuration.html),您可以在 Startup 方法中构建它并添加环境变量 appSettings。指定可选标志时,您可以将 appSettings.Production.json 用于生产环境,在没有可用的 appSettings.Development.json 时将 appSettings.json 用于开发。 appsettings.env.EnvironmentName.json 仅在文件存在且回退为默认 appsettings.json 时使用

public Startup(IHostingEnvironment env)

    // Set up configuration providers.
    var builder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.env.EnvironmentName.json", optional: true);

    if (env.IsDevelopment())
    
        // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
        builder.AddUserSecrets();
    

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();

【讨论】:

所以我需要在我的测试项目中添加一个 Startup 类? 是的,我看到 Will 的帖子增加了更多细节。但是您可以按照教程使用 ASP.NET 5 或从头开始创建 Web 应用程序。检查docs.asp.net/en/latest/tutorials/… 和docs.asp.net/en/latest/fundamentals/startup.html【参考方案4】:

我在我的测试项目的根目录中添加了一个appsettings.Development.json。然后我通过.ConfigureAppConfiguration() 方法添加了appsettings 文件。然后它将调用主应用程序的Startup() 方法,但使用appsettings.Development.json 中的配置设置。


    string Environment = "Development";

    var server = new TestServer(new WebHostBuilder()                
        .UseEnvironment(Environment)
        .ConfigureAppConfiguration(x => 
            x.SetBasePath(Directory.GetCurrentDirectory());
            x.AddJsonFile($"appsettings.Environment.json", optional: false, reloadOnChange: true);
            x.AddEnvironmentVariables();
            )
        .UseStartup<Startup>()                
        );

    httpClient = server.CreateClient();

httpClient 然后可以用于例如发出网络请求,例如:

var response = await httpClient.GetAsync(url);
var responseString = await response.Content.ReadAsStringAsync();

【讨论】:

以上是关于在测试项目中使用 ASP.NET Core 的 ConfigurationBuilder的主要内容,如果未能解决你的问题,请参考以下文章

在与 Asp.Net Core TestServer 的集成测试中设置虚拟 IP 地址

使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

使用 .NET Framework 集成测试 ASP.NET Core - 找不到 deps.json

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

[Asp.Net Core]IIS部署

在 ASP.Net Core 项目中使用 ADO.Net 将 JSON 类型作为参数传递给 SQL Server 2016 存储过程