【问题标题】:C# Environment variables in integration test集成测试中的 C# 环境变量
【发布时间】:2019-10-13 22:19:25
【问题描述】:

我已经构建了一个自定义 Web 应用程序工厂来运行内存测试服务器以进行集成测试。我们尝试使用 sql 数据库,而不是使用内存数据库。

我的问题是每个环境的连接字符串都在变化。我们有几个带有连接字符串的 appsettings{envName}.json 文件。所以,我需要找到一个获取环境变量的解决方案。这些是我的尝试:

public class CustomWebApplicationSQLServerFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureServices(services =>
        {
            var serviceProvider = new ServiceCollection()
                .AddEntityFrameworkSqlServer()
                .BuildServiceProvider();

            var env = serviceProvider.GetService<IHostingEnvironment>();

            Configuration = new ConfigurationBuilder()
                .SetBasePath(AppContext.BaseDirectory)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables()
                .Build();

            var defaultConnection = Configuration.GetConnectionString("DefaultConnection");
            var connectionString = string.Format(defaultConnection, "TestSampleOrder_" + Guid.NewGuid().ToString());

            services.AddDbContext<SampleOrderContext>(options =>
            {
                options.UseSqlServer(connectionString);
                options.UseInternalServiceProvider(serviceProvider);
            });

            var sp = services.BuildServiceProvider();

            using (var scope = sp.CreateScope())
            {
                var scopedServices = scope.ServiceProvider;

                var context = scopedServices.GetRequiredService<SampleOrderContext>();

                DbInitializer.InitializeDbForTests(context);
            }
        });
    }

我还在我的测试项目中添加了一个launchSettings.json 文件。在该文件中,在我的测试项目名称下,我添加了“ASPNETCORE_ENVIRONMENT”:“AnyValue”。所以,我不明白为什么env = null。做了更多的测试,env.EnvironmentName = "Development",应用名称和路径是主Project。为什么?孔解中未设置“开发”字样。

我也试过替换这个的 env 行:

var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

如果我设置了一个 Windows 变量,我可以使用它来获取值,但我需要了解如何在我的 launchSettings 文件中设置变量的值。

我尝试过的另一件事是:

var serviceProvider = services.BuildServiceProvider();

但我真的不明白其中的区别。

谁能帮我理解这是如何工作的,获取环境变量的最佳方法是什么以及使用 services.BuildServiceProvider() 和 new ServiceCollection() 之间的区别是什么?

非常感谢。

【问题讨论】:

  • 确定你需要测试吗? Environment.GetEnvironmentVariable 失败的唯一方法是 .NET Core 本身已损坏。 envName 只是一个字符串。它可以来自任何地方 - 对 Environment.GetEnvironmentVariable 的调用、命令行参数或传递给您的方法的参数。
  • 无论如何,var env = serviceProvider.GetService&lt;IHostingEnvironment&gt;(); 表示IHostingEnvironment 类本身就是一个依赖项。您可以在返回硬编码环境名称的测试中注册自己的 IHostingEnvironment 实现
  • 如何运行这个 Web 应用程序? dotnet cli 还是 Visual Studio?
  • 我正在使用 Visual Studio 运行它
  • 我已经编辑了我的问题。我的环境变量有“发展”数据。我在 Windows 中没有环境变量,在任何带有“开发”设置的 launchSettings.json 中也没有条目。事实上,即使在解决方案中进行了一次完整的搜索,也没有找到“开发”这个词。

标签: c# .net-core environment-variables integration-testing


【解决方案1】:

也许this question 可以提供一些见解。

话虽如此,使用配置进行测试的“最简单”的方法是抽象出您需要的内容。也许您可以构建一个适配器,为您提供环境名称,例如:

public interface IApplicationConfiguration
{
    string GetEnvironmentName();
}

public class ApplicationConfiguration
{
    private IHostingEnvironment _hostingConfiguration;

    public ApplicationConfiguration(IHostingEnvironment hostingConfiguration)
    {
        _hostingConfiguration = hostingConfiguration;
    }

    public string GetEnvironmentName()
    {
        return _hostingConfiguration.EnvironmentName;
    }
}

可以使用其他选项解决它,但模拟这些类型的设置可能非常有用。

【讨论】:

    猜你喜欢
    • 2017-06-21
    • 2011-03-05
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多