是否可以对ActiveRecord的save方法进行存根

时间:2019-03-03 00:37:24

标签: ruby-on-rails ruby rails-activerecord factory-bot minitest

在Rails测试中,相当慢的一点似乎来自与数据库的通信。我已经开始用create替换一些测试,这些测试将FactoryBot的buildbuild_stubbed方法称为。但是,有些测试涉及测试回调,有些甚至涉及测试多个回调如何彼此交互。

我开始四处搜寻,看看是否有人建立了一个存有save方法的库,但找不到任何东西。我在想一些可以正确顺序调用所有回调方法以及正确设置所有Active Model Dirty记录的东西。验证唯一性和回调中的任何ActiveRecord查询之类的事情都必须手动取消,以便不与数据库对话。

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

1 个答案:

答案 0 :(得分:0)

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

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

原因如下:

  • save只是在Rails中访问数据库的众多方式之一
  • ActiveRecord通过设计将您的域模型与数据持久性紧密结合在一起,从而难以仅对持久性进行存根
  • SQL / RDBMS是其功能的宏伟抽象,要构建一个有价值的模拟程序来对它进行存根将非常困难

我听说有一些项目试图解决上述原因,而这些项目与Rails应用程序的通常构建方式大相径庭:

  • 将替代对象用于域模型而不是ActiveRecord,并且仅以极为受控和受约束的方式使用AR。
  • 避免完全使用ActiveRecord来支持另一种ORM,因为ORM可使域模型与持久性脱钩

换句话说,考虑到ActiveRecord通常扮演的角色,这需要对“常规Rails应用程序”的体系结构和用法进行根本性的改变。