【问题标题】:Tests with transactions in TypeORM使用 TypeORM 中的事务进行测试
【发布时间】:2021-11-25 14:36:20
【问题描述】:

在 Rails 上,每个测试用例都会创建一个 ActiveRecord 事务,它允许测试所有内容,然后将数据库恢复到原始状态,而无需删除所有表或任何可能影响播种机等的事情。 可以在 TypeORM 上做这样的事情吗? 据我所见,事务记录工作方式的主要问题是对另一个方法的调用不会使用创建的事务,但我希望我错过了其他一些实现它的方式。

谢谢!

【问题讨论】:

  • 我刚刚找到了一个想法来存根 getRepository() 以在测试中使用连接设置并启动事务。我对存根还不熟悉,现在就开始玩吧!
  • 有趣,如果它有效,请告诉我@outluch :)

标签: typeorm


【解决方案1】:

我的期望和你完全一样。来自 Rails 和 Spring,我希望进行事务测试,但没有直接从 Typeorm 找到解决方案。

在测试期间很难重用相同的事务,因为连接类总是为每个数据库命令或事务创建一个新的 QueryRunner。深入研究 TypeORM,我发现的解决方案是修改创建查询运行器的方法,以便在测试期间重用它。我创建了这个库以在多个项目中重用这段代码:https://github.com/viniciusjssouza/typeorm-transactional-tests

【讨论】:

    【解决方案2】:

    我知道这已经很晚了,但我实际上也在研究一个解决方案,您可以在这里看到:https://www.npmjs.com/package/typeorm-test-transactions

    我的一个免责声明是您必须使用 @Transactional() 装饰器,但我喜欢它如何使代码更简洁,并且您不必向下传递事务管理器。

    @viniciusjssouza我检查了你的解决方案,我真的很喜欢!很有趣,我认为我们俩同时遇到了同样的问题:P

    【讨论】:

    • 不错!我们拥有的选择越多,对社区就越好:D
    【解决方案3】:

    您可以考虑另一种方法。您可以通过序列化 + 多个数据库来隔离它们,而不是通过事务来隔离测试。

    在高层次上,方法如下:

    • 将测试分成 N 个组,每个组都有自己的数据库,N 大致是您拥有的 cpu 核心数。
    • 在每个组中,测试都是连续运行的。测试开始时也会重置数据库。
    • 每个组彼此并行运行。

    这种方法非常容易使用 Jest 和 Docker 进行设置,并允许您实现高度并行。

    我在这里写了一篇博文,更详细地描述了这种方法: https://blog.mikevosseller.com/2021/11/25/how-to-run-jest-with-multiple-test-databases.html

    【讨论】:

      猜你喜欢
      • 2020-02-17
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2022-09-28
      • 2019-12-04
      • 1970-01-01
      相关资源
      最近更新 更多