2

我正在开发一个使用 RSpec 测试的 Rails 应用程序。在等待测试完成后,我遵循了Gary Bernhardt 的建议Paul Annesley 的这篇内容丰富的帖子,并设置了一个分层的 spec_helper,我只加载我绝对需要的 Rails 部分,以缩短测试时间并提取功能到我单独测试的单独模块中。

这在一定程度上是可行的。问题是我有一个模块(ActiveSupport::Concern扩展find_and_create_by_. 到目前为止,我已经能够创建一个包含模块的虚拟类并对其进行测试,但现在我想将更多逻辑从我的 ActiveRecord 模型移动到模块中。

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

我现在被困在我的测试中有两个选择:

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

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

4

2 回答 2

1

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

我没有合适的文章,但你可以参考这个 gist on setting up the spork with guard

这些是我使用的资源

警卫

叉子

高温高压

于 2013-01-09T06:57:00.917 回答
1

选项 1 似乎很诱人,但恕我直言,它充满了危险。您需要做的嘲笑和存根的范围很像拉姆斯菲尔德谚语中的“未知未知数”之一。你最终会放弃所有的 ActiveRecord 吗?

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

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

于 2013-01-09T07:03:46.587 回答