我想在我的Integration测试项目的IServiceCollection对象中添加一些Services到Startup.cs。
我在我的集成测试的WebHostBuilder的ConfigureServices方法中添加了我的TestConfiguration,但是在我的启动类之前调用它,所以我的测试配置被覆盖了。
测试类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 Project Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton((b) =>
new TokenClient(m.AccessTokenUrl,
SecurityConfig.PublicApiClientId,
SecurityConfig.PublicApiClientPassword));
}
答案 0 :(得分:0)
我认为您需要为生产和测试创建不同的Startup
类。
然后必要的Startup
将选择&#34;取决于当前的构建。
例如:
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类中使用特定于环境的方法。但我的拙见是,这会导致测试和登台代码之间产生过多的耦合。
答案 1 :(得分:0)
自ASP Core 2.1以来,ConfigureTestServices
上有一个WebHostBuilder
方法可用,该方法在从Startup.cs
注册后运行。因此您的代码将如下所示:
var builder = new WebHostBuilder()
.UseEnvironment("development")
.UseContentRoot(contentRoot)
.ConfigureTestServices(TestConfigureServices)
.UseStartup<Startup>();