问题描述
所以这里有一点背景:
我有一个 ASP.NET 核心项目,一切都设置好了。我有不同的服务需要测试。 我为此创建了一个 UnitTest 项目。
我的问题是,当我尝试测试谷歌驱动器上传服务(需要服务提供者(IServiceProvider))时,但我找不到任何方法来实例化服务提供者,通常它在由 ASP.Net Core 本身启动,但正如我所说,出于测试目的,我需要在我的 UnitTest 项目中从头开始完全实例化。
这是我当前的 UnitTest 项目设置:
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json",optional: true,reloadOnChange: true)
.Build();
var serviceCollection = new ServiceCollection();
Startup s = new Startup(configuration);
s.ConfigureServices(serviceCollection);
/*serviceCollection.AddScoped<GoogleService>();
//serviceCollection.AddSingleton(_appContext);
serviceCollection.AddSingleton<Service.Domains.ApplicationDomain.Bll.Models.ApplicationCache>();
serviceCollection.AddScoped<Service.Services.AuditService>();
serviceCollection.AddHttpContextAccessor();*/
IServiceProvider provider = serviceCollection.BuildServiceProvider();
//services.AddScoped<Service.Services.AuditService>();
_service = new AuditService(GetDatabaseContext(),configuration,provider);
解决方法
看来修复很简单:
我们可以在 Program 类中重用 HostBuilder :
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json",optional: true,reloadOnChange: true)
.Build();
var serviceCollection = new ServiceCollection();
Startup s = new Startup(configuration);
s.ConfigureServices(serviceCollection);
var hostBuilder = Program.CreateHostBuilder(new string[] { }).Build().Services;
//services.AddScoped<Service.Services.AuditService>();
_auditService = new AuditService(GetDatabaseContext(),configuration,hostBuilder.GetRequiredService<IServiceProvider>());