【发布时间】:2019-05-09 13:45:18
【问题描述】:
我正在使用自定义 WebApplication 工厂
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup: class {
protected override void ConfigureWebHost(IWebHostBuilder builder) {
builder.ConfigureServices(services => {
// Create a new service provider.
var serviceProvider = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();
services.AddDbContext<GrabGoContext>(options => {
options.UseInMemoryDatabase("GrabGoDb");
options.UseInternalServiceProvider(serviceProvider);
});
services.AddSingleton<TestEmailServer>();
services.AddScoped<IEmailProvider, TestEmailProvider>(); // <- HERE
});
base.ConfigureWebHost(builder);
}
我想将我的默认IEmailProvider服务DefaultEmailProvider切换到我的特殊TestEmailProvider,但问题是方法ConfigureWebHost在Startup.ConfigureServices(IServiceCollection services)之前执行,所以我的服务DefaultEmailProvider设置在之后TestEmailProvider。因此在我的ClientController 服务中使用DeafultEmailProvider 而不是测试服务。
我的问题是:
如何使用 WebApplicationFactory 将服务 DefaultEmailProvider 与我的 TestEmailProvider 切换?
@更新
好的,我已经设法更深入了。我发现builder.ConfigureTestServices() 方法覆盖了其他服务。但是,当在我的 ConfigureWebHost(IWebHostBuilder builder) 方法中切换它并尝试使用 CreateClient() 创建新的 HttpClient 时,它会抛出:
System.InvalidOperationException: 'A ConfigureServices method that returns an IServiceProvider is not compatible with the use of one or more IStartupConfigureServicesFilter. Use a void returning ConfigureServices method instead or a ConfigureContainer method.'
@更新 28.05.2019
仍在寻找更好的解决方案,但我已经设法进行了 hack。
在我的Startup.cs 中,我已经交换了我的
services.AddScoped<IEmailProvider, SendGridEmailProvider>();
使用 TryAdd[Something]
services.TryAddScoped<IEmailProvider, SendGridEmailProvider>();
【问题讨论】:
标签: c# asp.net-core xunit