4

我在 .net core 2.2 中有 api 项目和测试项目。现在我已经在 .net core 3.1 中迁移了这两个项目

在测试项目中,我有“初始化”方法,我在其中手动添加服务

public void Initalize(){

var services = new ServiceCollection();
services.AddDbContext<DatabaseContext>(opt =>
   opt.UseInMemoryDatabase("EdgePrototype").UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
services.AddHostedService<QueuedHostedService>();
services.AddSingleton<IBackgroundTaskQueue, BackgroundTaskQueue>();
services.AddSingleton<TempFileCleanupProvider>();
services.AddSingleton<IHostedService, TempFileCleanupService>();
services.AddSingleton<DbCleanupProvider>();
services.AddSingleton<IHostedService, DbCleanupService>();
services.AddSingleton<IBackgroundTaskQueue, BackgroundTaskQueue>();

ServiceProvider = services.BuildServiceProvider();
ServiceScope = new Mock<IServiceScope>();
ServiceScope.Setup(x => x.ServiceProvider).Returns(ServiceProvider);
ServiceScopeFactory = new Mock<IServiceScopeFactory>();
ServiceScopeFactory
    .Setup(x => x.CreateScope())
    .Returns(ServiceScope.Object);

// Hosted Service
var service = ServiceProvider.GetService<IHostedService>() as QueuedHostedService;
service.StartAsync(CancellationToken.None);}

在 .net core 2.2 中,上述代码运行良好,但迁移后“GetService”方法总是返回“null”。

我在下面的问题中尝试了接受的答案。它在 .net core 2.2 中工作,但在 .net core 3.1 托管服务集成测试 .Net-Core中不工作

任何人都可以建议我应该对 .net core 3.1 的上述代码进行哪些更改?

4

1 回答 1

3

由于服务集合中似乎存在多个托管服务,因此需要更改为测试解决所需托管服务的方法。

//...

// Hosted Service
IHostedService service = ServiceProvider.GetServices<IHostedService>()
    .OfType<QueuedHostedService>().First();

//Act
service.StartAsync(CancellationToken.None);}

//...

使用GetServices<T> (注意复数services获取所有已注册的托管服务,并使用 LINQ 过滤掉您想要的服务。

于 2020-10-27T03:59:48.193 回答