为 UnitTest 项目实例化一个 serviceprovider

问题描述

所以这里有一点背景:

我有一个 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>());

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...