gpt4 book ai didi

c# - 事务集成测试 ASP.Net Core 和 Entity Framework Core

转载 作者:太空宇宙 更新时间:2023-11-03 12:20:09 24 4
gpt4 key购买 nike

我很好奇是否有人走上了使用 aspnet 和 ef core 进行事务集成测试的道路?我希望能够一直执行完整的集成测试到数据库(不使用内存中的数据库)。有两个问题:

  • 测试可能有副作用,但应该单独运行,因为副作用可能导致其他测试失败。我不希望开发人员在每次测试后都需要编写过多的清理代码。
  • 我可以在每次测试运行时拆卸并重新创建数据库,但随着测试计数开始达到 100 秒,运行测试的速度变得难以忍受。

我想在事务中包装测试 (_dbContext.Database.BeginTransactionAsync())。问题是我从中获得的 DbContext:

_server = new TestServer(builder);
_services = _server.Host.Services;
_dbContext = (AppDbContext)_services.GetService(typeof(AppDbContext))

将与 AspNetCore 中间件解析的范围不同(因此是不同的实例)。因此,只有测试代码是事务性的,TestServer 执行的任何代码都不是。我考虑过在 TestStartup 类中使用一些测试中间件,将 API 代码包装在事务中,但问题是它会在测试评估它之前被处理/回滚。考虑以下用例:

  • 发送 POST 创建资源
  • 断言 dbContext 包含资源

在这种情况下,测试需要访问测试服务器使用的相同 dbContext 实例。我尝试了一些使用 AsyncLocal 传递上下文的 hacky 方法,但没有用,所以我只是尝试使用一个简单的 static 成员。 但是,这也没有用,所以测试应用和 TestServer 之间似乎存在一些 AppDomain 隔离。 我很好奇是否有人沿着这条路走下去,如果是的话,他们想到了什么?

最佳答案

只是关闭这个问题。解决方案是在测试启动类中将 DbContext 注册为单例。所以,在测试中:

services.AddDbContext<HostContext>(Configure, ServiceLifetime.Singleton);

但是,在应用程序中它将被注册为:

services.AddDbContext<HostContext>(Configure, ServiceLifetime.Transient);

更新

此处发布了更完整的答案 http://nance.io/leveling-up-your-dotnet-testing-transactional-integration-testing-in-asp-net-core/

关于c# - 事务集成测试 ASP.Net Core 和 Entity Framework Core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47740479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com