【发布时间】:2019-02-21 12:34:34
【问题描述】:
这是我遇到的一个非常奇怪的问题。我正在尝试设置 TestServer 来测试 ASP.NET API。在这个特定的测试中,我想使用不同的配置 appsettings.custom.json,而不是项目的 appsettings.json。所以,当我创建 TestServer 时,我会这样做:
protected TestServer CreateTestServer()
{
var testConfiguration = new AspNetTestConfiguration(); // configures middleware, authentication, default/static files
var configFile = "appsettings.custom.json";
var config = new ConfigurationBuilder().AddJsonFile(configFile).Build();
Container.Configure(cfg => cfg.For<IConfiguration>().Use(config)); // attempt 1 - that's my StructureMap container used for DI
// Create the WebHostBuilder used by the test server
var webHostBuilder = WebHost.CreateDefaultBuilder()
.ConfigureServices(svc =>
{
svc.AddSingleton(Container);
svc.AddSingleton(config); // attempt 2
svc.AddSingleton(testConfiguration);
})
.UseConfiguration(config) // attempt 3
.UseStartup<TestStartup>();
return new TestServer(webHostBuilder);
}
但是,当我进入我的控制器时,通过依赖注入在构造函数中提供了一个IConfiguration,我访问了IConfiguration 中的设置,发现这些值来自appsettings.json!
正如您在上面看到的,我尝试了 3 种不同的方法来说服 TestServer 它必须使用来自 appsettings.custom.json 的配置值,但无济于事。
为什么还坚持使用appsettings.json,如何解决?
更新:
越来越好奇。我尝试将 appsettings.json 重命名为 appsettings.default.json 并将其设置为我的默认设置文件。现在,神奇的是,我的TestServer 正在使用appsettings.custom.json,这是我期望的!
【问题讨论】:
-
最好的方法是使用相同的配置文件并添加选项进行测试。
-
我建议您使用 WebApplicationFactory for integration testing,它还支持重新配置应用程序。 – 自定义中间件和服务之类的东西,甚至是不同的启动,都是让您的测试完全不代表您的应用程序的好方法,因此您应该避免这样做。始终测试您的实际应用程序,并且仅在您需要使其作为测试工作时进行部分替换。
标签: c# asp.net-core structuremap