2011-02-10 16 views
13

no puedo encontrar la manera de llegar spork no cargar todos mis modelos de aplicaciones. La prueba de los cambios en mis modelos se ralentiza mucho ya que no puedo usar spork para ayudar. Esto es lo que me pasa cuando depurar lo spork está cargando:Spork.prefork está cargando app/modelos/*

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

actualización: mi 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} 

Si me mudo fuera del require File.expand_path(File.dirname(__FILE__) + '/../config/environment') prefork, mis modelos no están precargados, pero como es de esperar, lleva mucho más tiempo ejecutar mis pruebas.

¿Alguna idea sobre cómo conseguir spork para no cargar modelos en una aplicación Rails 3? He intentado usar spork 0.8.4, rama principal, y actualmente 0.9.0.rc3. ¿Alguien tiene alguna idea de cómo puedo evitar cargar los modelos?

+0

no veo este comportamiento, utilizando spork 0.8.4. ¿Estás seguro de que tu bloque de prefork es correcto? – zetetic

+0

He actualizado la descripción de mi bloque pre_fork en mi spec_helper.rb –

+0

todavía no estoy viendo el problema. Tal vez algo está pasando en 'config/environment '? – zetetic

Respuesta

17

Después de girar mucho tiempo mis ruedas fin tengo algo que es aceptable:

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 

El problema se debe principalmente a los carriles :: MongoId # load_models. Después de inspeccionar la salida de depuración de spork y la traza inversa de cómo se cargan las cosas, se proporcionan algunas pistas sobre qué está cargando los modelos. Esta página va a un poco más de detalle https://github.com/timcharper/spork/wiki/Spork.trap_method-Jujutsu, pero no encuentro las reload_routes:! ayudando con Devise forzando a la clase User a ser precargada.

mi especificaciones están corriendo mucho más rápido ahora. Si solo pudiera hacer que mi modelo de Usuario no se almacenara en la memoria caché, estaría feliz, pero hasta entonces, estaré mayormente satisfecho.

+0

Gracias por publicar esto. – zetetic

7

La siguiente solución sugerida here funciona para mí. También recarga el modelo de Usuario.

# 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

tengo la siguiente configuración en tanto RSpec y pepino on Rails 3.1 y los modelos son refrescantes:

Set factory_girls_rails require => false en su Gemfile

gem 'factory_girl_rails', :require => false 

Vuelva a colocar la Spork.prefork y Spork. each_run bloquea con el siguiente código.

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

¡Esta es una muy buena plantilla de configuración de Spork a seguir! Hará que Spork se comporte de la manera en que "lo esperabas en primer lugar". Animo a todos los que lean esto a seguir este consejo. – cailinanne

+0

Wow, de hecho, pensé que Spork lo hace de manera predeterminada y siempre me sorprendió que no volviera a cargar mis modelos. ¡Gracias! –

+1

Puede reemplazar 'YourApp :: Application.reload_routes!' Con 'Rails.application.reload_routes' para hacerlo más genérico. –

3

Esta solución funciona para mí (de 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 

Tenga en cuenta que haciendo un "modelo de carga" en each_run es sólo una solución parcial, esto va a volver a evaluar el código del modelo, pero para instancia después de eliminar un método de modelo, seguirá existiendo en la memoria hasta que reinicie Spork.

+0

¡Gracias por este comentario! Funcionó para mí ;-) – raskhadafi

Cuestiones relacionadas