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

3

当我修改共享示例时,如何让spork重新加载它们?我尝试了以下方法,但它没有重新加载它们:

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

我知道可以在我的Guardfile中添加一个watcher,以便在共享示例更改时重新加载环境,但我的应用程序很大,需要10-15秒钟才能重新加载整个环境。
watch(/^spec\/shared_examples\/.*\.rb$/)

我希望它只重新加载更改的共享示例,这样我就可以拥有更快的反馈循环。

3个回答

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行代码之间进行排序,以确保所有内容都正确加载。


感谢您的评论。事实证明,我做得是对的,但我愚蠢地在prefork和each_run中都要求共享示例。由于某种原因,这导致了某种冲突,并且它们在每次运行时都没有被加载。 - Peter Brown
很高兴我能提供帮助。如果你认为我的回答有帮助并准确无误的话,我会感激你的点赞支持。祝好运! - Kevin Bedell

3

事实证明,我在Spork.prefork中也加载了shared_examples,在某些情况下这会导致它们不能在每次运行时重新加载。将该行从Spork.prefork中删除,并仅在Spork.each_run中使用可以解决问题,现在对任何shared_examples的更改都会反映在每次测试运行时。


你如何在prefork块中加载共享示例?我们的prefork块中有Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f},这肯定会加载所有内容(包括共享示例)。你如何防止在prefork块中加载共享示例? - Joshua Muheim
1
啊,我明白了:我们把共享的示例放在 spec/support/shared_examples 下,而你把它放在 spec/shared_examples 下。将它们移动到 spec/shared_examples 下可以解决问题,但是这是否是共享示例所属的位置呢?如果我不想将它们移出 support 文件夹,该如何防止它们在 prefork 块中被加载? - Joshua Muheim
1
因此,在prefork中使用此代码行,共享示例不会被加载:Dir[Rails.root.join("spec/support/**/*.rb")].reject{ |f| f[%r{/shared_examples/}] }.each { |f| require f } - Joshua Muheim

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

预派生(prefork)不是只在环境加载时运行一次吗? - Peter Brown
是的,但你需要告诉它去监视那些文件 ;) - thiagofm
1
我不确定我是否理解了... Spork实际上并不监视文件,这就是我使用guard的原因。 - Peter Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接