簡體   English   中英

在測試項目中使用 ASP.NET Core 的 ConfigurationBuilder

[英]Using ASP.NET Core's ConfigurationBuilder in a Test Project

我想在我的功能測試項目中使用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實例。

您可以通過幾個步驟在測試項目中使用ConfigurationBuilder 我認為您不需要IHostingEnvironment接口本身。

首先,將兩個 NuGet 包添加到具有ConfigurationBuilder擴展方法的項目中:

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

如果您想使用完全相同的設置文件(而不是副本),那么您需要添加一個路徑。

為了完整起見,我將在此處添加此答案,因為我遇到了與 @vaindil 在 Will's answer 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

這是可能的,根據 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();
}

我在我的測試項目的根目錄中添加了一個appsettings.Development.json 然后我通過 .ConfigureAppConfiguration .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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM