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

Posted

技术标签:

【中文标题】在 ASP.NET Core 集成测试中从 WebApplicationFactory<T> 获取服务【英文标题】:Get service from WebApplicationFactory<T> in ASP.NET Core integration tests 【发布时间】:2019-03-15 16:04:01 【问题描述】:

我想使用WebApplicationFactory&lt;T&gt; 设置我的测试,详见 Integration tests in ASP.NET Core.

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

我可以使用factory.Host.Services.GetRequiredService&lt;ITheType&gt;();factory.Server 获得服务,除非factory.Server 在调用factory.CreateClient(); 之前为空。

我有什么方法可以使用工厂获得服务吗?

谢谢。

【问题讨论】:

测试用的startup不可以注册使用服务吗?展示你目前正在尝试做的事情 或者你可以自定义工厂docs.microsoft.com/en-gb/aspnet/core/test/… 谢谢@Nkosi。我需要获得在真实启动中注册的服务,而不是在测试启动中注册。我想使用完全配置的应用程序运行测试,所以我需要获得真正的服务,调用几个方法来设置一些数据,然后运行我的测试场景。我需要能够在每次测试中获得这项服务。 创建一个继承自真实启动的测试启动。覆盖配置服务,调用基础,构建提供者获取服务并执行设置 如果我能看到一些代码,我可能会提供更详细的解释。 【参考方案1】:

您需要从服务提供商处创建一个范围来获得必要的服务:

using (var scope = AppFactory.Server.Host.Services.CreateScope())

    var context = scope.ServiceProvider.GetRequiredService<MyDatabaseContext>();

【讨论】:

如果factory.Servernull,请考虑先调用factory.CreateClient()【参考方案2】:

请原谅我。我知道你要求的是 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.

在此注明,by designs.

所以我使用下面的方法。我将数据库播种放在测试类的构造函数中。请注意,我不必致电factory.CreateClient()。我像往常一样在测试方法中创建客户端变量。

using (var scope = this.factory.Services.CreateScope())

    var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>();

    // Seeding ...

    dbContext.SaveChanges();

【讨论】:

以上是关于在 ASP.NET Core 集成测试中从 WebApplicationFactory<T> 获取服务的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC CORE Web 应用程序集成测试与 EF Core 内存数据库 - 每次测试的新数据库

ASP.NET Core运行两个TestServer进行集成测试

使用 ASP.NET Core 和 Entity Framework Core 进行集成测试 - 如何在每次测试时恢复数据库中的测试数据?

不得不说的 ASP.NET Core 集成测试

不得不说的 ASP.NET Core 集成测试

不得不说的 ASP.NET Core 集成测试