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

时间:2013-01-09 05:34:34

标签: ruby-on-rails testing rspec rails-activerecord

我正在使用Rails应用程序,我正在使用RSpec进行测试。经过大量等待测试完成后,我跟着Gary Bernhardt's advicethis informative post by Paul Annesley并设置了一个分层spec_helper,我只加载了我绝对需要的Rails部分,以缩短测试时间,并提取功能分成单独的模块,我单独测试。

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

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

我现在已经陷入困境,但我的测试中有两个选择:

  1. 存根和/或模拟我在模块中调用的每个ActiveRecord方法,这将使测试保持快速但可能使测试代码非常复杂,或者
  2. 要求在测试中使用activerecord,让我的虚拟类继承自ActiveRecord::Base,然后测试模块,因为我会测试任何其他的rails模型,这会慢一点,但保持测试代码干净。
  3. 后一个选项并不真正吸引我,因为我在模块中隔离代码的全部原因是我想将它与Rails分开。我不是在这里寻找黑色或白色的答案,但是有人会对这种情况有任何建议或指向最佳实践吗?非常感谢提前!

2 个答案:

答案 0 :(得分:1)

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

我没有正确的写作,但你可以参考这个要点来设置 spork with guard

这些是我使用的资源

guard

spork

HTH

答案 1 :(得分:1)

选项1似乎很诱人,但却充满了危险的恕我直言。你需要做的嘲弄和诅咒的范围很像拉姆斯菲尔德的谚语"unknown unknowns"。你最终会最终删除所有的ActiveRecord吗?

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

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