0

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を自動ロードしないことです。

4

1 に答える 1

0

同僚と私は今日この問題に直面しましたが、最終的には実行ごとにクラスをリロードするために Spork が必要であることがわかりました。これを行うために each_run() メソッドを使用しました。

Spork.each_run do
  Dir[Rails.root.join("app/classes/**/*.rb")].each {|f| require f}
end
于 2013-05-10T20:02:53.807 に答える