c# - 来自集成测试的 ASP.NET Core UseSetting

标签 c# asp.net testing asp.net-core integration-testing

我有一个在测试类中使用 .UseSetting() 的集成测试项目,如下所示:

public AccessTokenRetrieval() : base(nameof(AccessTokenRetrieval))
{
    var connectionString = GetConnectionString();
    var dbSettings = new DbSettings(connectionString);
    _userGroupRepository = new UserGroupRepository(dbSettings);
    _roleRepository = new RoleRepository(dbSettings);
    _userRepository = new UserRepository(dbSettings);

    _server = new TestServer(new WebHostBuilder()
        .UseStartup<Startup>()
        .UseEnvironment("IntegrationTest")
        .UseSetting("IntegrationTestConnString", dbSettings.IdentityServerConnectionString));
    _handler = _server.CreateHandler();
    _client = _server.CreateClient();
}

我现在想在实际项目的 Startup.cs 中检索该设置。我尝试使用:

public void ConfigureIntegrationTestServices(IServiceCollection services)
{
    var connectionString = Configuration.GetValue<string>("IntegrationTestConnString");

    BuildIdentityServerTests(services, connectionString);
    AddCoreServices(services, connectionString);
}

但这似乎返回 null。

检索此设置的正确方法是什么?

最佳答案

您可以只注入(inject) IConfigurationRoot,您可以在测试项目中使用本地配置文件。您会丢失默认的特定于环境的配置覆盖,这是新项目模板中的默认设置,但我个人无论如何都不会将它们用于配置管理(更喜欢非提交的 appsetting.local.json,这对开发人员来说是独一无二的)和 CI 服务器)。

var configuration = new ConfigurationBuilder()
    .SetBasePath(AppContext.BaseDirectory)
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile("appsettings.local.json", optional: true, reloadOnChange: true)
    .AddInMemoryCollection(new Dictionary<string, string>
    {
        {"myConfig:setting1", "value1"},
        {"myConfig:setting2", "value2"}
    })
    .Build();

var server = new TestServer(new WebHostBuilder()
    .UseUrls("http://localhost:5001")
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseStartup<Startup>()
    .ConfigureServices(services => services.AddSingleton(configuration)));

对于启动:

public class Startup
{
    public Startup(IConfigurationRoot configuration)
    {
        this.Configuration = configuration;
    }

    ...
}

编辑: 虽然这确实有效,但它似乎也打破了 IOptionsSnapshot 配置注入(inject),无法在运行时识别配置文件更改。我将留下这个答案,但也会继续挖掘更好的方法,而无需注入(inject)自定义服务来支持测试/夹具特定的配置覆盖。

关于c# - 来自集成测试的 ASP.NET Core UseSetting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44444819/

相关文章:

c# - 优秀的 Silverlight 自定义项目控件教程

c# - 将一个数组中的字符串中的字符高效替换为另一个数组

c# - 该项目当前包含对多个版本的引用

c# - ASP.NET Core 等效于 ASP.NET MVC BeginExecuteCore

asp.net - 为什么 IIS 在第一次访问时很慢,但之后会更快?

java - 在测试/最佳实践中访问 Junit 测试结果?

c# - 使用日期时间、小数、GUID 和 Nullable 类型时,MVC 模型绑定(bind)速度较慢

c# - 解析 'The specified string is not in the form required for a subject.'

java - 如果测试失败,如何配置 testcontainers 以保持数据库容器运行?

java - 如何使用不同的包管理 Selenium 项目代码(如页面对象模型/关键字驱动框架)