在我的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定義。