使用Guard和Spork重新加载RSpec共享示例

时间:2012-05-11 14:42:57

标签: ruby-on-rails ruby rspec spork guard

当我对其进行更改时,如何让spork重新加载我的共享示例?我尝试了以下内容,但它没有重新加载它们:

Spork.each_run do
  Dir[Rails.root.join("spec/shared_examples/*.rb")].each {|f| require f}
end

我知道我可以在我的Guardfile中添加一个观察程序,让它在共享示例更改时重新加载env,但我的应用程序很大,需要大约10-15秒才能重新加载整个环境:

watch(/^spec\/shared_examples\/.*\.rb$/)

我更愿意让它重新加载已更改的共享示例,因此我可以有更快的反馈循环。

3 个答案:

答案 0 :(得分:8)

以下是您需要检查的几件事:

在环境配置文件test.rb中,请确保您拥有此

  config.cache_classes = !(ENV['DRB'] == 'true')

如果您在Spork环境中,那么确保您不会缓存课程。

然后,确保它们在.each_run

FactoryGirl.reload
ActiveSupport::Dependencies.clear
ActiveRecord::Base.instantiate_observers

这应该确保你每次运行都重新加载类。

我还会将您的share_examples加载到.each_run部分。

Spork.each_run do
  FactoryGirl.reload
  ActiveSupport::Dependencies.clear
  ActiveRecord::Base.instantiate_observers
  Dir[Rails.root.join("spec/shared_examples/*.rb")].each {|f| require f}  
end

您可能需要使用.each_run部分中4行的顺序来确保所有内容都正确加载。

答案 1 :(得分:3)

原来我在Spork.prefork中加载了shared_examples,并且由于某些原因导致他们不为每次运行重新加载。从Spork.prefork中删除该行并仅在Spork.each_run中使用它修复了该问题,现在任何shared_examples的更改都会在测试运行时反映出来。

答案 2 :(得分:0)

Spork.prefork do
  Dir[Rails.root.join("spec/shared_examples/*.rb")].each {|f| require f}
end