Railsアプリに次のファイルを追加しました:
app / models / baz.rb
lib / presenters / foo_presenter.rb
lib / presenters / foo_presenter / bar.rb
spec / models / baz_spec.rb
spec / lib / presenters / foo_presenter / bar_spec.rb
lib / presenters/foo_presenter.rbの内容は次のようになります。
module Presenters
module FooPresenter
def self.render
# do stuff
end
end
end
lib / presenters / foo_presenter/bar.rbの内容は次のようになります。
module Presenters
class FooPresenter::Bar
def baz
# do stuff
end
end
end
spec / lib / presenters / foo_presenter/bar_spec.rbの内容は次のとおりです。
require 'spec_helper'
module Presenters::FooPresenter
describe Bar do
# some tests
end
end
次に、spec / models/baz_spec.rbにスペックファイルがあります。
require 'spec_helper'
describe Baz do
it 'works' do
Presenters::FooPresenter.render
end
end
(app / models / baz.rbの内容はこの問題とは関係ありません)
問題は、実行するrspec spec/models/baz_spec.rb
とsporkがなくても正常に動作することですが、sporkを実行すると、次のようなエラーが発生します:NameError:undefined method `render'forプレゼンター::FooPresenter:Module
コードを少しトレースすると、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が実行されている場合にのみ発生します。簡単な修正はrequire 'foo_presenter'
config/initializersのファイルにありましたが、明示的なrequireを必要としないよりクリーンなソリューションはありますか?私の推測では、ここでの問題は、Presenters :: FooPresenterがすでにbar_spec.rbによって定義されているため、Railsがlib / presenters/foo_presenter.rbを自動ロードしないことです。