C# 使用ASP.NET核心&x27;测试项目中的ConfigurationBuilder

C# 使用ASP.NET核心&x27;测试项目中的ConfigurationBuilder,c#,.net,asp.net-core,asp.net-core-mvc,C#,.net,Asp.net Core,Asp.net Core Mvc,我想在我的功能测试项目中使用IHostingEnvironment和ConfigurationBuilder,以便根据环境使用不同的配置集运行功能测试。我想使用下面的代码: public IConfigurationRoot ConfigureConfiguration(IHostingEnvironment hostingEnvironment) { var builder = new ConfigurationBuilder() .AddJsonFile("appse

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

public IConfigurationRoot ConfigureConfiguration(IHostingEnvironment hostingEnvironment)
{
    var builder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", true)
        .AddEnvironmentVariables();
    return builder.Build();
}

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

的实例,根据ASP.NET核心文档()的说法,这是可能的,您可以在启动方法中构建它并添加环境变量appSettings。指定可选标志时,可以在没有可用的appSettings.development.json时,将appSettings.Production.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();
}

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

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

"dependencies": {
  "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc1-final",
  "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final"
}
其次,将所需的环境变量放入测试项目的属性中:

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

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

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

为了完整起见,我将在此处添加此答案,因为我遇到了与Will答案中描述的@vaindil相同的问题。原因是我们从测试代码中的环境变量填充了IConfiguration。这会覆盖我们在测试中使用appsettings.json设置的任何配置。 我们的解决方案是使用
System.environment.setEnvironmentVariable(“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
//为简洁起见省略了代码
var builder=新的WebHostBuilder()
.环境(“发展”)
.ConfigureAppConfiguration(configurationBuilder=>configurationBuilder.AddenEnvironmentVariables())
.UseStartup();
var testServer=newtestserver(构建器);//对此进行测试

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


字符串Environment=“Development”;
var server=newtestserver(newwebhostbuilder()
.UseEnvironment(环境)
.ConfigureAppConfiguration(x=>{
x、 SetBasePath(Directory.GetCurrentDirectory());
x、 AddJsonFile($“appsettings.{Environment}.json”,可选:false,reloadOnChange:true);
x、 AddEnvironmentVariables();
})
.UseStartup()
);
httpClient=server.CreateClient();
然后,可以使用httpClient进行web请求,例如:

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

所以我需要在我的测试项目中添加一个Startup类?是的,我看到Will的帖子增加了更多细节。但是,您可以按照教程使用ASP.NET5或从头开始创建web应用程序。检查,我的测试项目完全忽略我设置的任何配置;它正在运行主项目的
启动
,即使我从测试类中删除了对它的所有引用。我想不出来/我经历了与@vaindil相同的问题,并在我的回答中描述了对我有用的东西: