2011-02-10 9 views
13

Nie mogę wymyślić, jak uzyskać spork, aby nie ładować wszystkich moich modeli aplikacji. Testowanie zmian w moich modelach jest znacznie spowolnione, ponieważ nie jestem w stanie użyć pomocy. To, co mam, kiedy debugowania co Spork się ładuje:Spork.prefork ładuje aplikację/modele/*

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

aktualizacji: My spec_helper.rb

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} 

Jeśli przenieść require File.expand_path(File.dirname(__FILE__) + '/../config/environment') z prefork moi modele nie są fabrycznie, ale jak można się spodziewać, przeprowadzanie moich testów trwa znacznie dłużej.

Jakieś pomysły na to, jak sporkować, aby nie ładować modeli w aplikacji Rails 3? Próbowałem używać spork 0.8.4, master branch, a obecnie 0.9.0.rc3. Czy ktoś ma jakieś pomysły, jak mogę uniknąć wcześniejszego załadowania modeli?

+0

Nie widzę takiego zachowania, używając narzędzia 0.8.4. Czy na pewno twój blok prefektury jest poprawny? – zetetic

+0

Zaktualizowałem opis za pomocą mojego bloku pre_fork w moim spec_helper.rb –

+0

Nadal nie widzę problemu. Może coś dzieje się w 'config/environment '? – zetetic

Odpowiedz

17

Po dużo czasu przędzenia moich kół I wreszcie mamy coś, co jest dopuszczalne:

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 

problem był głównie ze względu na Rails :: Mongoid # load_models. Po sprawdzeniu danych wyjściowych debugowania i danych śledzenia obciążenia, podano wskazówki dotyczące ładowania modeli. Ta strona idzie na nieco więcej szczegółów: https://github.com/timcharper/spork/wiki/Spork.trap_method-Jujutsu, ale nie znajduję: reload_routes! pomagając w Devise, zmuszając klasę użytkownika do wstępnego załadowania.

Moje dane techniczne są teraz znacznie szybsze. Gdybym tylko mógł uzyskać mój model Użytkownika, by nie był przechowywany w pamięci podręcznej, byłbym w błogości, ale do tego czasu będę w większości zadowolony.

+0

Dzięki za wysłanie tego. – zetetic

7

Następujące rozwiązanie zasugerowało here dla mnie. Odświeża również model użytkownika.

# 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

Mam następującą konfigurację zarówno RSpec i Cucumber on Rails 3.1 i modele są orzeźwiające:

zestaw factory_girls_rails require => false w Gemfile

gem 'factory_girl_rails', :require => false 

Wymień Spork.prefork i Spork. every_run blokuje za pomocą następującego kodu.

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

To jest naprawdę fajny szablon do konfiguracji Spocka! Sprawi to, że Spork będzie zachowywał się tak, jak "spodziewaliście się tego w pierwszej kolejności". Zachęcam wszystkich, którzy to czytają, do przestrzegania tej porady. – cailinanne

+0

Wow Myślałem, że Spork robi to domyślnie i zawsze byłem zaskoczony, kiedy nie przeładowałem moich modeli. Dzięki! –

+1

Możesz zamienić 'YourApp :: Application.reload_routes!' Na 'Rails.application.reload_routes', aby było bardziej ogólne. –

3

Rozwiązanie to działa na mnie (z 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 

Zauważ, że robi „model obciążenia” w each_run jest tylko częściowe rozwiązanie, będzie ponownie ocenić kod modelu, ale dla instancja po usunięciu metody modelu nadal będzie istnieć w pamięci do czasu ponownego uruchomienia Spork.

+0

Dzięki za ten komentarz! To zadziałało dla mnie. ;-) – raskhadafi