【问题标题】:Testing Rails module without loading ActiveRecord在不加载 ActiveRecord 的情况下测试 Rails 模块
【发布时间】:2012-12-23 02:59:08
【问题描述】:

我正在开发一个使用 RSpec 测试的 Rails 应用程序。经过大量等待测试完成后,我遵循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 模型一样测试模块,这会更慢但保持测试代码干净。

后一个选项对我来说并没有真正的吸引力,因为我将代码隔离在一个模块中的全部原因是我想将它与 Rails 分开。我不是在这里寻找黑色或白色的答案,但有人会对这种情况的最佳实践有任何建议或指示吗?提前非常感谢!

【问题讨论】:

  • 你在用工厂女孩吗..!
  • 没有,但我在其他项目中有。但这不会改变速度问题,即使您使用工厂,您仍然需要 activerecord。

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


【解决方案1】:

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

我没有合适的文章,但你可以参考这个 gist 来设置 spork with guard

这些是我使用的资源

guard

spork

HTH

【讨论】:

  • 是的,我过去曾使用过guard和spork。我希望完全避免加载 activerecord,但我认为这是非常不现实的,在这种情况下,其他解决方案(例如这些)将不得不这样做。谢谢!
【解决方案2】:

选项 1 看起来很诱人,但恕我直言,它充满了危险。您需要做的嘲笑和存根的范围很像拉姆斯菲尔德的谚语"unknown unknowns" 之一。你最终会去掉所有的 ActiveRecord 吗?

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

我很想看到一个可以替代 ActiveModel/ActiveRecord 的模拟库来实现这个目的。我想说的是,除非你能够容忍花费大量时间来构建这样的东西,否则你最好选择选项 2。

【讨论】:

  • 谢谢,这几乎是我得出的结论,但你把它说得更容易让我自己证明它的合理性;)我会再等一会儿看看是否其他答案进来,否则我会接受这个。
  • 作为旁注,我还认为用于测试目的的 ActiveModel/ActiveRecord 的基本组件替换的 gem 将非常有用。我想所涉及的工作使它不太可能建成......rspec/rails/mocks 有你需要的非常少的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 2012-12-23
  • 2011-04-15
  • 2012-03-09
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多