【发布时间】:2012-12-23 02:59:08
【问题描述】:
我正在开发一个使用 RSpec 测试的 Rails 应用程序。经过大量等待测试完成后,我遵循Gary Bernhardt's advice 和this informative post by Paul Annesley 并设置了一个分层的spec_helper,我只加载我绝对需要的Rails 部分,以缩短测试时间,并将功能提取到单独的模块中我单独测试。
这在一定程度上是可行的。问题是我有一个模块(扩展 ActiveSupport::Concern),其中包含基于 ActiveRecord 功能的实例和类方法,例如绑定到动态查找器,例如find_and_create_by_。到目前为止,我已经能够创建一个包含模块的虚拟类并对其进行测试,但现在我想将更多逻辑从我的 ActiveRecord 模型移动到模块中。
具体的例子是回调、验证器和方法委托之类的东西,所有这些都与我正在访问的 API 相关。
虽然我的测试中有两个选择,但我现在被困住了:
- 存根和/或模拟我在模块中调用的每个 ActiveRecord 方法,这样可以使测试保持快速,但可能会使测试代码变得非常复杂,或者
- 在测试中需要 activerecord,让我的虚拟类继承自
ActiveRecord::Base,然后像测试任何其他 rails 模型一样测试模块,这会更慢但保持测试代码干净。
后一个选项对我来说并没有真正的吸引力,因为我将代码隔离在一个模块中的全部原因是我想将它与 Rails 分开。我不是在这里寻找黑色或白色的答案,但有人会对这种情况的最佳实践有任何建议或指示吗?提前非常感谢!
【问题讨论】:
-
你在用工厂女孩吗..!
-
没有,但我在其他项目中有。但这不会改变速度问题,即使您使用工厂,您仍然需要 activerecord。
标签: ruby-on-rails testing rspec rails-activerecord