2011-05-06 4 views
13

Spork 테스트 서버에 문제가 있습니다.rspec, factory_girl 및 datamapper의 spork 및 cache_classes 문제

config/environments/test.rb에서 config.cache_classes = false로 설정하면 specs가 오류를 시작합니다.

Failure/Error: task = Factory(:something, :foo => @foo, :bar => @bar) 
    DataMapper::ImmutableError: 
     Immutable resource cannot be modified 

내 spec_helper.rb입니다 :

require 'spork' 

Spork.prefork do 
    if ENV['CODE_COVERAGE'] == '1' 
    require 'simplecov' 
    SimpleCov.start 'rails' 
    end 

    ENV["RAILS_ENV"] ||= 'test' 
    require File.expand_path("../../config/environment", __FILE__) 
    require 'rspec/rails' 
    require 'webmock/rspec' 
    require 'factory_girl' 

    Dir[Rails.root.join("spec/controllers/shared/*.rb")].each { |f| require f } 
    Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } 

    RSpec.configure do |config| 
    config.mock_with :mocha 
    config.include Rails.application.routes.url_helpers 
    config.include UrlHelper 

    config.before(:each) do 
     repository(:default) do 
     transaction = DataMapper::Transaction.new(repository) 
     transaction.begin 
     repository.adapter.push_transaction(transaction) 
     end 
    end 

    config.after(:each) do 
     repository(:default).adapter.pop_transaction.try(:rollback) 
    end 

    end 
end 

# This code will be run each time you run your specs. 
Spork.each_run do 
    # reload factories 
    Factory.definition_file_paths = Dir[File.join(Rails.root, "spec", "factories")] 
    Factory.find_definitions 

    DatabaseCleaner.strategy = :truncation 
    DatabaseCleaner.clean 
    LoggedEvent.all.destroy! 

end 

내가 config.cache_classes이있을 때 = true로 '모든 것이 잘 작동하지만, 그것은 나에게 모델, 컨트롤러 클래스를 다시로드하지, 그래서 돈 이 경우에는 spork을 사용할 지점을 확인하십시오.

나는 캐시에 해당하는 경우,이 같은 것을 spec_helper.rb에 추가하려고 :

Spork.each_run do 
    Dir.glob("#{Rails.root}/app/models/*.rb").sort.each { |file| load file } 
end 

하지만이 솔루션을 좋아하지 않는다.

답변

20

그냥 추가 :

ActiveSupport::Dependencies.clear 

선 분기 블록의 끝. 이렇게하면 모델 지우기가 처리됩니다.

또한 해당 rspec 구성 포함 항목을 Spork.each_run으로 이동하려는 경우 사양 지원 및 공유 파일이 필요합니다.

이 작품은 어떤 문제가없는 2 개의 프로젝트에서이 설정을 사용합니다.

+3

잠깐만, ActiveSupport :: Dependencies.clear가 prefork 또는 each_run에 속해 있습니까? 상반된 이야기를 보았습니다. 두 가지 모두로드 문제를 일으키는 두 가지 모두 작동하지 않습니다. "예상 xxxx에서 xxxx를 정의합니다." 또한 문제를 해결하는 것은'ActiveSupport :: Dependencies.clear'입니까? 또는 원래 질문의 each_run 예제와 함께 필요한 것입니까? –

+0

왜 그런지 모르겠지만 갑자기이 일을 시작한 프로젝트가 명백한 이유가 없습니다. 나는 Spork.each_run에 Dependencies.clear를 넣는 것을 끝내었고 그것은 나를 위해 일했습니다. 내 Rspec.config는 each_run에 없지만 FactoryGirl.reload와 ActiveSupport :: Dependencies.clear 만 있습니다. 희망이 도움이됩니다. –

+0

ActiveSupport :: Dependencies.clear가 prefork의 끝에서 추가되어야 함 (each_run이 아님) – Ran

8

시도 ActionDispatch :: config/environments/test.rbconfig.cache_classes = false을 설정하는 것 외에도

은 다음 DataMapper 및 Spork는 우리 팀이 멋지게 연주 할 것 같다 장전 :

Spork.each_run do 

    # Routes 
    MyApp::Application.reload_routes! 

    if Spork.using_spork? 
    # Reload all app files 
    ActionDispatch::Reloader.cleanup! 
    ActionDispatch::Reloader.prepare! 

    # All factories 
    FactoryGirl.reload 
    end 

end 
+0

니스. 나는 그것을 기대하지 않았지만 몽고와 스포크에 대한 나의 문제를 해결하는 것처럼 보였다. 주제에 관한 다른 모든 문서 ([Spork.trap_method Jujitsu] (https://github.com/sporkrb/spork/wiki/Spork.trap_method-Jujitsu)와'ActiveSupport :: Dependencies.clear')는 모든. 나는 Rails :: Mongoid.load_models에서 여분의 함정을 제거 할 수 있었다. –

+1

이 접근 방식에는 실제로 ActiveSupport :: Dependencies.clear 이상이 포함됩니다. ActionDispatch :: Reloader.cleanup 호출! 준비! 정확하게 다시로드 무엇입니까! 레일 콘솔에서 작동합니다. +1 –

0

안녕 내가 나에게 도움이 무엇을 공유하기를 원해요 다시 테스트를 실행합니다.
spouch가 연결이 끊어지는 것에 대해 불평하는 것처럼 나는 shared_connection 트릭을 추가해야했습니다.
내 모델을 캐싱 할 때 블록 끝에서 dependency.clear 라인을 이동해야했습니다.

Spork.each_run do 
    # ActiveSupport::Dependencies.clear # <-- moved this line at end of block as suggested by @solnic 
    ActiveRecord::Base.instantiate_observers 
    MyApp::Application.reload_routes! 
    FactoryGirl.reload 

    class ActiveRecord::Base 
    mattr_accessor :shared_connection 
    @@shared_connection = nil 

    def self.connection 
     @@shared_connection || retrieve_connection 
    end 
    end 
    ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection 

    ActiveSupport::Dependencies.clear # <-- line moved here 

end if Spork.using_spork?