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

时间:2016-04-29 16:38:40

标签: c# .net asp.net-core asp.net-core-mvc

我想在我的功能测试项目中使用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的实例。

4 个答案:

答案 0 :(得分:11)

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

首先,将两个NuGet包添加到项目中,其中包含ConfigurationBuilder扩展方法:

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

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

environment variable dialog

然后,您可以在测试项目中创建自己的构建器:

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();
}

如果你想使用完全相同的设置文件(不是副本),那么你需要添加一个路径。

答案 1 :(得分: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

答案 2 :(得分:1)

这是可能的,根据ASP.NET核心文档(http://docs.asp.net/en/latest/fundamentals/configuration.html),您可以在Startup方法中构建它并添加Environment变量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();
}

答案 3 :(得分:0)

我在测试项目的根目录中添加了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可用于例如发出Web请求,例如:

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