2011-02-10 4 views
13

लोड कर रहा है मैं यह नहीं समझ सकता कि स्पार्क को मेरे सभी ऐप मॉडल लोड नहीं करना है। मेरे मॉडल में परीक्षणों में बदलाव बहुत धीमा हो गया है क्योंकि मैं सहायता के लिए स्पार्क का उपयोग करने में असमर्थ हूं। , मेरे spec_helper.rbSpork.prefork ऐप/मॉडल/*

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} 

अगर मैं prefork से बाहर require File.expand_path(File.dirname(__FILE__) + '/../config/environment') ले जाते हैं, अपने मॉडल पहले से लोड नहीं कर रहे हैं:

 
    - 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 `' 

अद्यतन: यह जब मैं डिबग क्या spork लोड कर रहा है कि मैं क्या मिलता है लेकिन जैसा कि आप उम्मीद कर सकते हैं कि मेरे परीक्षण चलाने में काफी समय लगता है।

किसी भी विचार को रेल 3 एप पर मॉडलों को लोड न करने के लिए स्पार्क कैसे प्राप्त करें? मैंने स्पार्क 0.8.4, मास्टर शाखा, और वर्तमान में 0.9.0.आरसी 3 का उपयोग करने का प्रयास किया है। क्या किसी के पास कोई विचार है कि मैं मॉडल को पहले से लोड करने से कैसे बच सकता हूं?

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

मुझे स्पार्क 0.8.4 का उपयोग करके इस व्यवहार को नहीं दिख रहा है। क्या आप सुनिश्चित हैं कि आपका प्रीफ़र्क ब्लॉक सही है? – zetetic

+0

मैंने अपने spec_helper.rb –

+0

में अपने pre_fork ब्लॉक के साथ विवरण अपडेट किया है, मुझे अभी भी समस्या दिखाई नहीं दे रही है। हो सकता है कि कुछ 'कॉन्फ़िगरेशन/पर्यावरण' में चल रहा हो? – zetetic

उत्तर

17

ज्यादा समय मेरी पहियों कताई के बाद मैं अंत में कुछ ऐसा है जो स्वीकार्य है। स्पार्क के डीबग आउटपुट का निरीक्षण करने के बाद और चीजों को कैसे लोड किया जाता है इसका बैकट्रैक, कुछ सुराग मॉडल के लोडिंग के लिए प्रदान किए जाते हैं। यह पृष्ठ थोड़ा अधिक विस्तार से https://github.com/timcharper/spork/wiki/Spork.trap_method-Jujutsu में जाता है, लेकिन मुझे यह नहीं मिलता है: reload_routes! उपयोगकर्ता वर्ग को प्रीलोड करने के लिए मजबूर करने के लिए डेविस के साथ मदद करना।

मेरी चश्मा अब बहुत तेजी से चल रही हैं। अगर केवल मैं अपने उपयोगकर्ता मॉडल को कैश नहीं किया जा सकता, तो मैं आनंद में रहूंगा, लेकिन तब तक, मैं अधिकतर संतुष्ट रहूंगा।

+0

इसे पोस्ट करने के लिए धन्यवाद। – zetetic

7

निम्नलिखित समाधान का सुझाव दिया गया है here मेरे लिए काम करता है। यह उपयोगकर्ता मॉडल को फिर से लोड करता है।

gem 'factory_girl_rails', :require => false 

Spork.prefork और Spork बदलें अपनी Gemfile में

सेट factory_girls_rails require => false:

# 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 और ककड़ी में निम्नलिखित सेटअप और मॉडल ताज़ा कर रहे हैं। निम्नलिखित कोड के साथ प्रत्येक_रुन ब्लॉक।

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

यह वास्तव में एक अच्छा स्पार्क सेटअप टेम्पलेट का पालन करने के लिए है! यह स्पार्क को "जिस तरह से आप पहली जगह में उम्मीद करते थे" व्यवहार करेंगे। मैं इस सलाह का पालन करने के लिए इसे पढ़ने वाले किसी को भी प्रोत्साहित करता हूं। – cailinanne

+0

वाह मैंने वास्तव में सोचा कि स्पार्क डिफ़ॉल्ट रूप से ऐसा करता है और जब मैं अपने मॉडल को पुनः लोड नहीं करता था तो मैं हमेशा आश्चर्यचकित था। धन्यवाद! –

+1

आप इसे अधिक सामान्य बनाने के लिए 'YourApp :: Application.reload_routes!' के साथ 'Rails.application.reload_routes'' को प्रतिस्थापित कर सकते हैं। –

3

यह समाधान मेरे लिए काम करता (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 

ध्यान दें कि एक "लोड मॉडल" each_run में कर केवल एक आंशिक समाधान है, इस मॉडल कोड फिर से मूल्यांकन होगा, लेकिन के लिए एक मॉडल विधि को हटाने के बाद उदाहरण यह तब भी स्मृति में मौजूद होगा जब तक आप स्पार्क को पुनरारंभ नहीं करते।

+0

इस टिप्पणी के लिए धन्यवाद! यह मेरे लिए काम किया। ;-) – raskhadafi

संबंधित मुद्दे

 संबंधित मुद्दे