2013-01-18 2 views
0

와 모듈과 서브 클래스와 RSpec에에서 이상하게 동작 I했습니다 추가 한 다음 파일 :
응용 프로그램/모델/baz.rb
lib 디렉토리/발표자/foo_presenter.rb
lib 디렉토리/발표자 /foo_presenter/bar.rb
사양/모델/baz_spec.rb
사양/lib 디렉토리/발표자/foo_presenter/bar_spec.rb 레일 자동 로딩 내 레일 응용 프로그램에서 spork

lib 디렉토리/발표자/foo_presenter.rb의 내용

가 뭔가 같은 :

lib 디렉토리/발표자/foo_presenter/bar.rb의개

내용은 같다 : 사양/lib 디렉토리/발표자/foo_presenter/bar_spec.rb의

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

내용은 같은 것입니다 :

require 'spec_helper' 

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

그럼 난 사양/모델/baz_spec.rb의 사양 파일이 : 응용 프로그램/모델의

require 'spec_helper' 

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

(내용을/baz.rb이 관련이 없습니다 내가 rspec spec/models/baz_spec.rb를 실행할 때 문제)
문제는 그것이 spork없이 잘 작동하지만 spork가 실행 중일 때, 내가 좋아하는 오류 얻을 : 나가서 설명하자면 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' 이었지만 명확한 요구 사항이 필요없는 더 깨끗한 솔루션이 있습니까? 내 추측은 여기서 레일즈가 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 
관련 문제