![](/img/trans.png)
[英]Asp.Net Core 5.0 Issue with IServiceCollection services
[英]Adding additional services to IServiceCollection in Startup class for Integration test in asp.net core 2.0
我想将IServiceCollection对象中的其他服务从我的集成测试项目添加到Startup.cs。
我将TestConfiguration添加到集成测试的WebHostBuilder的ConfigureServices方法中,但在启动类之前调用了它,因此测试配置被覆盖。
测试类TestSetup.cs
var builder = new WebHostBuilder()
.UseEnvironment("development")
.UseContentRoot(contentRoot)
.ConfigureServices(TestConfigureServices)
.UseStartup<Startup>();
private void TestConfigureServices(IServiceCollection serviceCollection)
{
serviceCollection.AddSingleton((c) =>
new TokenClient(TokenEndpoint,
"api.public.client",
"psdfsrfsdf",
innerHttpMessageHandler: _handler));
}
API项目Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton((b) =>
new TokenClient(m.AccessTokenUrl,
SecurityConfig.PublicApiClientId,
SecurityConfig.PublicApiClientPassword));
}
我认为您需要为生产和测试创建不同的Startup
类。 然后,必要的Startup
将根据当前版本“选择”。 例:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IYourService, YourService>();
}
}
public class StartupTesting
{
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IYourService, YourMockedService>();
}
}
var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;
//var assemblyName = typeof(StartupTesting).GetTypeInfo().Assembly.FullName;
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup(assemblyName)
.Build();
host.Run();
更新:
还有第二种方法-在一个Startup类中使用特定于环境的方法。 但是我的拙见是,这会导致测试和登台代码之间的耦合过多。
从ASP Core 2.1开始, WebHostBuilder
上提供了ConfigureTestServices
方法,该方法在从Startup.cs
注册后运行。 因此,您的代码如下所示:
var builder = new WebHostBuilder()
.UseEnvironment("development")
.UseContentRoot(contentRoot)
.ConfigureTestServices(TestConfigureServices)
.UseStartup<Startup>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.