2013-01-18 22 views
0

在我的Rails應用程序我已經添加了以下文件:
應用程序/模型/ baz.rb
的lib /主持人/ foo_presenter.rb
的lib /主持人/foo_presenter/bar.rb
規格/型號/ baz_spec.rb
規格/ lib目錄/主持人/ foo_presenter/bar_spec.rbRails的自動加載奇怪的行爲在RSpec中的模塊和子類與叉勺

的lib /主持人/ foo_presenter.rb的內容是這樣的:

module Presenters 
    module FooPresenter 
    def self.render 
     # do stuff 
    end 
    end 
end 

LIB /主持人/ foo_presenter/bar.rb的內容是這樣的:

module Presenters 
    class FooPresenter::Bar 
    def baz 
     # do stuff 
    end 
    end 
end 

規格/ LIB /主持人/ foo_presenter/bar_spec.rb的內容是這樣的:

require 'spec_helper' 

module Presenters::FooPresenter 
    describe Bar do 
    # some tests 
    end 
end 

然後我在規格/型號/ baz_spec.rb SPEC文件:

require 'spec_helper' 

describe Baz do 
    it 'works' do 
    Presenters::FooPresenter.render 
    end 
end 

(該應用程序/模型的內容/ baz.rb是不相關的這問題)
問題是,當我運行rspec spec/models/baz_spec.rb它工作正常無叉勺,但叉勺運行時,我得到這樣一個錯誤: NameError:未定義的方法`呈現」的主持人:: FooPresenter:模塊

我追查通過代碼了一下,注意到當rspec加載spec/lib/presenters/foo_presenter/bar_spec.rb時,它會導致Rails自動加載lib/presenters/foo_presenter/bar.rb,並在此時加載Presenters :: FooPresenter :: Bar ,但是當baz_spec.rb運行時,lib/presenters/foo_presenter.rb從未加載過,因此也是異常。但是這隻有在spork正在運行時纔會發生。快速修復是在config/initializers中的require 'foo_presenter'文件中,但是有更清晰的解決方案,不需要明確的require?我的猜測是這裏的問題是Rails不會自動加載lib/presenters/foo_presenter.rb,因爲Presenters :: FooPresenter已經由bar_spec.rb定義。

回答

0

一位同事和我今天面對這個問題,最終我們發現我們需要Spork在每次運行中重新加載班級。我們使用each_run()方法來執行此操作:

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