【问题标题】:How to resolve the cache_clases = true/false conflict using Spork, RSpec & Cucumber?如何使用 Spork、RSpec 和 Cucumber 解决 cache_classes = true/false 冲突?
【发布时间】:2012-01-21 15:02:09
【问题描述】:

我在 RSpec 中遇到了很长时间的问题,我的模型在 Spork 运行之间没有重新加载。

我最终通过更改config/environments/test.rb 中的以下行来解决此问题:

config.cache_classes = true

成为

config.cache_classes = false

但是...虽然这解决了 RSpec 的问题,但 Cucumber 要求将 cache_classes 设置为 truehttps://rspec.lighthouseapp.com/projects/16211/tickets/165

是否有适用于 RSpec 和 Cucumber 并成功重新加载 RSpec 模型的规范解决方案?

脚注

* 我为使 RSpec 重新加载模型而实施的其他更改包括将以下行添加到 spec_helper.rb

ActiveSupport::Dependencies.clear
FactoryGirl.reload

如果不设置cache_classes=true 行,这些行都不能解决问题。

【问题讨论】:

  • 我从来不需要关闭类缓存来让 spork 正常工作。我确实记得有一次用Factory.define :foo, :class => Foo 定义工厂会阻止 Foo 类被重新加载。指定一个类名而不是实际的类来解决这个问题。
  • Factory girl 和模型重新加载问题之间似乎确实存在关联。当您说“指定一个类名而不是修复该问题的实际类”时,您是什么意思?
  • 与其说 :class=> Foo 你可以说 :class=> 'Foo' (或 :class_name => "Foo" - 不记得了)
  • 我会试一试——我实际上发现了这个问题,即使与 factory_girl gem 的存在无关

标签: ruby-on-rails-3.1 rspec cucumber spork


【解决方案1】:

我遇到了这个问题,对我来说这是由于 Rails 的线程安全模式。确保 config.threadsafe!在我的测试环境中没有调用它为我修复了它。这是因为线程安全模式会阻止代码在每个请求上重新加载并禁用自动依赖加载,我猜 spork 在 each_run 中依赖它。

我正在调用 config.threadsafe!在 application.rb 中,所以我从那里删除了该调用,并将其放入 development.rb 和 production.rb 中。现在我可以将 config.cache_classes 设置为 true,并且 rspec 和 cucumber 在 spork 下可以愉快地工作。请注意,我在持久层和 Machinist 中使用 Mongoid 而不是 FactoryGirl 所以 YMMV。

另见http://rickyrobinson.id.au/2012/07/20/when-spork-puts-a-fork-in-your-cucumber-and-a-spanner-in-your-specs

【讨论】:

  • 谢谢。我暂时无法评论它,因为我已经放弃了一段时间的测试!不过等我回来的时候会再看看:)
猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 2013-10-05
  • 2012-02-24
  • 2012-01-09
  • 2016-02-22
  • 2013-11-09
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多