我有一个在测试类中使用 .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/