gpt4 book ai didi

entity-framework-core - 如何在数据库事务中包装使用 TestServer 的集成测试?

转载 作者:行者123 更新时间:2023-12-02 01:28:38 25 4
gpt4 key购买 nike

使用 xUnit 和来自 Microsoft.AspNet.TestHost 的 TestServer,如何将每个测试包装在一个数据库事务中,以便在测试后回滚?

下面是我如何创建 TestServer:

TestServer = new TestServer(TestServer.CreateBuilder()
.UseStartup<Startup>());

那里引用的 Startup 是 Web 应用程序项目中的 Startup。在该 Startup 类的 ConfigureServices 方法中,我像这样添加 EF:

services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<TrailsDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

我可以将 DbContext 拉回到服务中并在 Startup 类上存储一个静态引用,但这看起来很老套。有什么方法可以在创建 TestServer 的地方实例化 DbContext 并以某种方式让 Web 应用程序使用它而不是 Startup 中的那个类(class)?

编辑:我尝试在创建 TestServer 的地方实例化另一个 DbContext 实例,并在每次测试前使用该上下文删除和重新创建数据库,但这增加了每个测试的运行时间约为 10 秒。

最佳答案

一些建议:最简单的方法是在最后销毁测试数据库并为每次测试运行重新创建。这确保不会存在挥之不去的测试污染。

但是既然你问了怎么做,这可以通过扩展 Xunit 来完成。 Xunit 允许您定义自定义测试用例和测试运行器。完整的答案很难包含在 SO 答案中。最简单的解决方案是使用环境事务。 (危险!环境事务可能很棘手。)Xunit 有一个回滚事务的自定义 BeforeAfterTestAttribute 示例。 https://github.com/xunit/samples.xunit/tree/master/AutoRollbackExample .要使用环境事务,请关闭在环境事务存在时抛出的默认 EF 设置。(optionsBuilder.UseSqlServer().SuppressAmbientTransactionWarning())。

一个更复杂但更好的解决方案是覆盖 XunitTestCaseRunner 并将事务注入(inject)每个测试用例,确保在每个测试结束时回滚。

此外,EF 文档提供了使用 InMemory 提供程序进行测试的示例。您可能会发现这很有用。 "Testing In Memory : EF Core Docs"

关于entity-framework-core - 如何在数据库事务中包装使用 TestServer 的集成测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35442673/

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