在不加载ActiveRecord的情况下测试Rails模块

我正在研究一个Rails应用程序,我正在使用RSpec进行测试。 经过大量等待测试完成之后,我跟随了Gary Bernhardt的建议以及Paul Annesley的这篇信息性post并设置了一个分层spec_helper,我只加载了我绝对需要的Rails部分,以缩短测试时间,并提取function进入我单独测试的单独模块。

这是有道理的。 问题是我有一个模块(扩展ActiveSupport::Concern ),其中包含基于ActiveRecordfunction的实例和类方法,例如绑定到动态查找器,如find_and_create_by_ 。 到目前为止,我已经能够创建一个包含模块和测试的虚拟类,但现在我想将更多逻辑从我的ActiveRecord模型转移到模块中。

具体的例子可能是回调,validation器和方法委托之类的东西,所有这些都与它我正在访问的API有关。

虽然在我的测试中有两个选择,但我现在卡住了:

  1. 存根和/或模拟我在模块中调用的每个ActiveRecord方法,这将使测试保持快速但可能使测试代码非常复杂,或者
  2. 在测试中需要activerecord,让我的虚拟类inheritance自ActiveRecord::Base并且只测试模块,因为我会测试任何其他的rails模型,这会慢一些但保持测试代码干净。

后一种选择并不真正吸引我,因为我在模块中隔离代码的全部原因是我想将它与Rails分开。 我不是在寻找黑色或白色的答案,但有人会对这种情况有什么建议或最佳实践指示吗? 首先十分感谢!

选项1似乎很诱人,但充满了危险的恕我直言。 你需要做的嘲弄和诅咒的范围很像拉姆斯菲尔德众所周知的“未知的未知数” 。 你最终会最终删除所有的ActiveRecord吗?

即使你可以使它工作,它是否会容忍ActiveRecord的未来变化? 您是否需要更新您的模拟/存根以跟上新版本的步伐?

我很想看到一个可以替代ActiveModel / ActiveRecord的模拟库用于此目的。 我要说的是,除非你容忍花费最多的时间来构建这样的东西,否则你最好选择2。

对我来说加速我的测试过程的解决方案是结合spork和guard,实际上是看守和运行测试,但它会使你的过程速度加快。

我没有正确的写作,但你可以参考这个要点设置spork与警卫

这些是我使用的资源

守护

叉勺

HTH