2012-05-11 47 views
3

當我對它們進行更改時,如何讓spork重新加載我的共享示例?我嘗試以下,但它不是重裝他們:重新加載RSpec與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

原來我是加載Spork.prefork中的shared_examples,並出於某種原因導致它們不能爲每次運行重新加載。從Spork.prefork中移除該行並僅在Spork.each_run中修復此問題,並且現在更改爲任何shared_examples都會在測試運行時反映出來。

+0

你如何不在** prefork塊中加載共享示例?我們有'Dir [Rails.root.join(「spec/support/**/*。rb」)]。each {| f |在我們的'prefork'塊中需要f}'',它肯定會加載所有東西(包括共享示例)。 **你如何防止共享示例被加載到'prefork'塊中? –

+1

啊,我看到:我們在'spec/support/shared_examples'下有共享的例子,並且你在'spec/shared_examples'下有它。將它們移動到'spec/shared_examples'工作,但這是共享示例所屬?如果我不想將它們移出'support'文件夾,我該如何防止它們被加載到'prefork'塊中? –

+1

因此,在'prefork'中使用這行代碼,不會加載共享示例:'Dir [Rails.root.join(「spec/support/**/*。rb」)]。reject {| f | f [%r {/ shared_examples /}]} .each {| f |需要f}'。 –

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

prefork只在環境加載時才運行一次嗎? –

+0

是的,但你會告訴它看這些文件;) – thiagofm

+1

不知道我關注...... Spork實際上並沒有看文件,這就是我正在使用的守衛。 –

8

這裏有你需要檢查幾件事情:

在環境配置文件test.rb,請確保您有這個

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

這可以確保你不緩存如果你在Spork環境中的話。

然後,在確保這些都是.each_run

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

這應該確保你重裝班每次運行。

我還會在.each_run部分保留您的share_examples加載。

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 

您可能需要與4號線在.each_run部分的順序發揮到所有負載正確確保事情。

+0

感謝您的評論。事實證明我做得很對,但我在愚蠢地要求prefork和each_run中的共享示例。出於某種原因,它導致了某種衝突,並且在每次運行中都沒有加載。 –

+0

很高興我能幫到你。如果你認爲我的回答是有用和準確的,我會很高興得到一票。祝你好運! –

相關問題