在 ASP.NET Core 集成测试中从 WebApplicationFactory 获取服务<T>

问题描述 投票:0回答:3
我想使用

WebApplicationFactory<T>

 设置我的测试,详细信息请参见 
ASP.NET Core 中的集成测试

在进行一些测试之前,我需要使用在真实 Startup 类中配置的服务来进行设置。 我遇到的问题是我看不到从工厂获得服务的方法。

我可以使用

factory.Server

factory.Host.Services.GetRequiredService<ITheType>();
 获取服务,但在调用 
factory.Server
 之前,
factory.CreateClient();
 为空。

我是否缺少任何使用工厂获得服务的方法?

谢谢。

asp.net-core asp.net-core-mvc asp.net-core-webapi asp.net-core-2.1
3个回答
44
投票
您需要从服务提供商创建

范围才能获得必要的服务:

using (var scope = AppFactory.Server.Host.Services.CreateScope()) { var context = scope.ServiceProvider.GetRequiredService<MyDatabaseContext>(); }
    

23
投票

请原谅我。我知道您要求 Net Core 2.1,但自从 v3.1+ 以来,人们也来到了这里......

我的项目使用Net Core 3.1。当我像 Alexey Starchikov 的建议一样使用

AppFactory.Server.Host.Services.CreateScope()

 时,我遇到了这个错误。 

The TestServer constructor was not called with a IWebHostBuilder so IWebHost is not available.
此处注明,

按设计。

所以我使用以下方法。我将数据库播种放入测试类的构造函数中。请注意,我不必打电话给

factory.CreateClient()

。我像往常一样在测试方法中创建客户端变量。

using (var scope = this.factory.Services.CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>(); // Seeding ... dbContext.SaveChanges(); }
    

9
投票
在 APS.NET 6、7 和 8 中我必须使用

_factory.Services.CreateScope()

:

using var scope = _factory.Services.CreateScope(); var sender = scope.ServiceProvider.GetRequiredService<IEmailSender>(); await sender.SendAsync("Hello");
    
© www.soinside.com 2019 - 2024. All rights reserved.