2011-02-10 2 views
13

spork에서 내 앱 모델을 모두로드하지 못하게하는 방법을 알아낼 수 없습니다. spork을 사용하여 도움을받을 수 없기 때문에 모델 변경 테스트가 크게 느려집니다.Spork.prefork가 app/models/*을로드 중입니다.

 
    - Spork Diagnosis - 
    -- Summary -- 
    app/models/account.rb 
    app/models/admin.rb 
    app/models/affiliate.rb 
    app/models/app.rb 
    app/models/application_server.rb 
    app/models/domain_record.rb 
    app/models/domain_zone.rb 
    app/models/event.rb 
    app/models/oid.rb 
    app/models/user.rb 
    config/application.rb 
    config/boot.rb 
    config/environment.rb 
    config/environments/test.rb 
    config/initializers/api_conversions.rb 
    config/initializers/backtrace_silencers.rb 
    config/initializers/compass.rb 
    config/initializers/devise.rb 
    config/initializers/hoptoad.rb 
    config/initializers/inflections.rb 
    config/initializers/mime_types.rb 
    config/initializers/rspec_generator.rb 
    config/initializers/secret_token.rb 
    config/initializers/session_store.rb 
    config/routes.rb 
    lib/application_server_api.rb 
    lib/oid_helper.rb 
    lib/soa_record.rb 
    spec/spec_helper.rb 



    -- Detail -- 



    --- app/models/account.rb --- 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `block in require' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:227:in `load_dependency' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:346:in `require_or_load' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:300:in `depend_on' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:216:in `require_dependency' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/mongoid-2.0.0.rc.7/lib/rails/mongoid.rb:54:in `load_model' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/mongoid-2.0.0.rc.7/lib/rails/mongoid.rb:17:in `block (2 levels) in load_models' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/mongoid-2.0.0.rc.7/lib/rails/mongoid.rb:16:in `each' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/mongoid-2.0.0.rc.7/lib/rails/mongoid.rb:16:in `block in load_models' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/paths.rb:102:in `block in each' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/paths.rb:102:in `each' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/paths.rb:102:in `each' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/mongoid-2.0.0.rc.7/lib/rails/mongoid.rb:15:in `load_models' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/mongoid-2.0.0.rc.7/lib/mongoid/railtie.rb:88:in `block (2 levels) in ' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:419:in `_run_prepare_callbacks' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/actionpack-3.0.3/lib/action_dispatch/middleware/callbacks.rb:40:in `initialize' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/actionpack-3.0.3/lib/action_dispatch/middleware/stack.rb:33:in `new' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/actionpack-3.0.3/lib/action_dispatch/middleware/stack.rb:33:in `build' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/actionpack-3.0.3/lib/action_dispatch/middleware/stack.rb:79:in `block in build' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/actionpack-3.0.3/lib/action_dispatch/middleware/stack.rb:79:in `each' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/actionpack-3.0.3/lib/action_dispatch/middleware/stack.rb:79:in `inject' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/actionpack-3.0.3/lib/action_dispatch/middleware/stack.rb:79:in `build' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/application.rb:162:in `app' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/application/finisher.rb:35:in `block in ' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/initializable.rb:25:in `instance_exec' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/initializable.rb:25:in `run' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/initializable.rb:50:in `block in run_initializers' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/initializable.rb:49:in `each' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/initializable.rb:49:in `run_initializers' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/application.rb:134:in `initialize!' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/application.rb:77:in `method_missing' 
    config/environment.rb:8:in `' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `block in require' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:225:in `block in load_dependency' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:596:in `new_constants_in' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:225:in `load_dependency' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require' 
    spec/spec_helper.rb:9:in `block in ' 
    /Users/sean/.rvm/gems/ruby-1.9.2-p136/gems/spork-0.9.0.rc3/lib/spork.rb:23:in `prefork' 
    spec/spec_helper.rb:4:in `' 

갱신 : 내 spec_helper.rb

내가 prefork의에서 require File.expand_path(File.dirname(__FILE__) + '/../config/environment')를 이동하면 내 모델을 미리로드되지 않습니다
require 'rubygems' 
require 'spork' 

ENV["RAILS_ENV"] = "test" 

Spork.prefork do 
    require File.expand_path(File.dirname(__FILE__) + '/../config/environment') 
    require 'rspec/rails' 
end 

Spork.each_run do 
    # Hub::Application.reload_routes! 
end 

Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f} 

을, I가로드되는 것을 spork 디버깅 할 때 이것은 내가 무엇을 얻을 하지만 예상대로 테스트를 실행하는 데 시간이 오래 걸립니다.

spails에서 Rails 3 앱에서 모델을로드하지 못하게하는 방법에 대한 아이디어가 있습니까? spork 0.8.4, master branch, 그리고 현재 0.9.0.rc3을 사용해 보았습니다. 누구나 모델을 미리 불러야하는 것을 피할 수있는 아이디어가 있습니까?

Spork.prefork do 
    require "rails/mongoid" 
    Spork.trap_class_method(Rails::Mongoid, :load_models) 

    # The following does not work correctly with Devise's routes that load the User model. 
    # Results in NameError unintitialized * 
    # :reload_routes! triggers :devise_for which loads and caches the User class. 
    # https://github.com/timcharper/spork/wiki/Spork.trap_method-Jujutsu 
    # require "rails/application" 
    # Spork.trap_method(Rails::Application, :reload_routes!) 

    require 'factory_girl_rails' 
    Spork.trap_class_method(Factory, :find_definitions) 

    require File.expand_path(File.dirname(__FILE__) + '/../config/environment') 

end 

문제였다 주로 인해 레일 :: Mongoid 번호의 load_models : 많은 시간을 내 바퀴를 회전 한 후

+0

spork 0.8.4를 사용하여이 동작이 표시되지 않습니다. 선착장 블록이 정확합니까? – zetetic

+0

spec_helper.rb에서 내 pre_fork 블록으로 설명을 업데이트했습니다. –

+0

여전히 문제가 표시되지 않습니다. 어쩌면'config/environment '에서 어떤 일이 벌어지고 있을까요? – zetetic

답변

17

드디어 허용 무언가가있다. spork의 디버그 출력과 물건이 어떻게 로딩되는지에 대한 백 트레이스를 검사 한 후, 모델을 로딩하는 것에 대한 단서가 제공됩니다. 이 페이지는 좀 더 세부적인 내용으로 들어갑니다. https://github.com/timcharper/spork/wiki/Spork.trap_method-Jujutsu, 그러나 나는 : reload_routes를 찾지 못했습니다! Devise가 User 클래스를 미리로드하도록 도와줍니다.

내 사양이 훨씬 빨라지고 있습니다. 캐시되지 않도록 사용자 모델을 얻을 수만 있다면 행복하게 될 것입니다. 그러나 그때까지는 대부분 만족할 것입니다.

+0

게시 해 주셔서 감사합니다. – zetetic

7

다음 해결책은 here이 저에게 효과적이라고 제안했습니다. 또한 사용자 모델을 다시로드합니다.

# env.rb 
Spork.each_run do 
    require 'factory_girl_rails' 
    # reload all the models 
    Dir["#{Rails.root}/app/models/**/*.rb"].each do |model| 
    load model 
    end 
end 
8

나는 레일 3.1 RSpec에와 오이 모두에서 다음과 같은 설정을 가지고 모델은 상쾌 :

설정 factory_girls_rails require => false 당신의 Gemfile에

gem 'factory_girl_rails', :require => false 

가 Spork.prefork 및 Spork를 교체합니다. each_run은 다음 코드로 차단됩니다.

if Spork.using_spork? 

    ActiveSupport::Dependencies.clear 
    ActiveRecord::Base.instantiate_observers 

    Spork.prefork do 

    end 

    Spork.each_run do 
    require 'factory_girl_rails' 

    # reload all the models 
    Dir["#{Rails.root}/app/models/**/*.rb"].each do |model| 
     load model 
    end 

    # reload routes 
    Rails.application.reload_routes! 

    end 

end 
+0

이것은 정말 멋진 Spork 셋업 템플릿입니다! 그것은 Spork가 "처음에 예상했던"방식으로 행동하게합니다. 나는 이것을 읽은 누군가가이 조언을 따르도록 격려한다. – cailinanne

+0

와우 나는 실제로 Spork가 기본적으로이 작업을 수행한다고 생각하고 모델을 다시로드하지 않을 때 항상 놀라곤했습니다. 감사! –

+1

'YourApp :: Application.reload_routes!'를'Rails.application.reload_routes'로 대체하면 더욱 일반화 할 수 있습니다. –

3

이 솔루션은 each_run에서 "부하 모델을"일을하는 것은 단지 부분적인 해결책이 (http://my.rails-royce.org/2011/03/17/rspec-2-and-fixtures/에서) 나를 위해

Spork.prefork do 
    require 'rails/application' 
    Spork.trap_method(Rails::Application, :reload_routes!) 
    Spork.trap_method(Rails::Application::RoutesReloader, :reload!) 
    Spork.trap_method(Rails::Application, :eager_load!) 
    require File.expand_path("../../config/environment", __FILE__) 
    Rails.application.railties.all { |r| r.eager_load! } 

    require 'rspec/rails' 

    RSpec.configure do |config| 
    ... 
    end 
end 

참고 작동이 모델 코드를 다시 평가하고, 그러나에 대한 것입니다 인스턴스 메서드를 제거한 후에도 Spork를 다시 시작할 때까지 메모리에 남아 있습니다.

+0

이 의견을 보내 주셔서 감사합니다! 그것은 나를 위해 일했습니다. ;-) – raskhadafi