是否可以存根 ActiveRecord 的保存方法

Is it possible to stub ActiveRecord's save method

rails 测试似乎有点慢是因为与数据库的通信。我已经开始用 build_stubbed 替换一些调用 FactoryBot 的 createbuild 方法的测试。但是,有些测试涉及测试回调,有些甚至涉及测试多个回调如何相互交互。

我开始四处搜索,看看是否有人构建了一个存根保存方法的库,但找不到任何东西。我正在想象一些东西,它会以正确的顺序调用所有回调方法,并正确设置所有活动模型脏记录。验证唯一性以及回调中的任何 ActiveRecord 查询之类的事情都必须手动删除,我想是为了不与数据库对话。

是否有任何工具已经具有此功能?还是它没有价值,因为如果您无论如何都在执行所有这些操作,它最终不会对速度产生太大影响。关于存根保存方法,有什么我没有考虑的吗?

在测试 Rails 应用程序时 不可能 存根数据库吗?不,但这实际上是不可行的。

我所知道的最接近的是内存中 SQLite 实例上的 运行 Rails。

一些原因:

  • save 只是 Rails
  • 中访问数据库的众多不同方式之一
  • ActiveRecord 在设计上将您的域模型与数据持久性紧密耦合,因此很难仅存根持久性
  • SQL/RDBMS 是对它们可以做的事情的宏伟抽象,构建一个有价值的模拟来用
  • 存根是非常困难的

我听说有几个项目试图解决上述原因,但与 Rails 应用程序通常构建的常用方式有很大偏差:

  • 为域模型使用替代对象而不是 ActiveRecord,并且仅以极其受控和约束的方式使用 AR。
  • 避免完全使用 ActiveRecord 以支持不同的 ORM —— 一种使领域模型与持久性分离的 ORM

换句话说,考虑到 ActiveRecord 通常扮演的角色有多大,它需要对 "conventional Rails app" 的架构和使用进行根本性的改变。