ruby on rails - rails - Spork: ¿cómo actualizar las validaciones y otros códigos?
formularios en ruby on rails (4)
Con las versiones más recientes de Factory Girl, no necesitas hacer mucho. Primero, agregue FactoryGirl.reload
en Spork.each_run
. Si tiene fábricas con el parámetro de class
, deben ser de cadena.
factory :my_model, class: ''MyModel'' do...
en lugar de
factory :my_model, class: MyModel do...
He estado usando Spork todo el día, y la mayoría del tiempo es realmente genial.
Sin embargo, a menudo me encuentro con algunos problemas en los que necesito reiniciar Spork para que pasen mis pruebas ... y ahora me pregunto si es más problema de lo que vale. Soy nuevo en ruby, por lo que a veces no puedo predecir si el error se debe a un problema de actualización, o si el error se debe a que no estoy familiarizado con Ruby y Rails.
¿Qué debo poner en el bloque Spork.each_run para que mis validaciones y otras cosas se actualicen de modo que no tenga que reiniciar el servidor spork?
Gracias
Sin embargo, seguirá habiendo un pequeño problema. Si actualiza app / models / person.rb, el cambio no tendrá efecto en sus pruebas, ya que Spork tiene a la Persona anterior aún en la memoria. Una forma de solucionar esto es editar config / environment / test.rb y cambiar:
config.cache_classes = true
A:
config.cache_classes = false
Use Guard para recargar Spork cuando actualice sus clases Guard :: Spork le permite iniciar / recargar de manera automática e inteligente su servidor RSpec / Cucumber Spork.
EDITAR: Si puede actualizar a Ruby 2.0 esta es su mejor apuesta. Es lo suficientemente rápido y le permitirá trabajar de manera regular sin necesidad de herramientas como Spork, Zeus y ect. Y en esencia no necesitarás nada de lo que escribí a continuación.
Si aún necesitas un golpe de velocidad mientras desarrollas, revisa los comandos Fast Rails Commands .
Bueno, sí, desea volver a cargar Spork si cambió los archivos de entorno, inicializador o spec_helper (y para ese guard-spork es perfecto), pero no cuando actualizó una de sus clases (modelos), ya que esto negaría el propósito de herramientas como spork . Tenía el mismo problema: podía eliminar todos los métodos en un modelo, y las pruebas seguirían pasando, porque Spork tiene la clase de modelo "antiguo" en la memoria. Fue necesario reiniciar Spork.
Razón:
Algunos complementos hacen que el código del modelo se cargue previamente, por lo que se requiere cierto trabajo para evitar que suceda.
Desea evitar que el código del modelo se cargue previamente, ya que esto no los "volverá a cargar" si realiza cambios (como con las validaciones).
Soluciones:
Depende de las gemas que estén involucradas. En mi caso, tuve que lidiar con Devise y FactoryGirl, pero en esencia, lo haces usando Spork.trap_method como se describe en wiki: https://github.com/sporkrb/spork/wiki/Spork.trap_method-Jujitsu
Además, puede ejecutar spork -d
para obtener una lista de los archivos que están precargados, puede ser útil rastrear qué gemas pueden estar involucradas para causar este problema.
Ejemplo: Rails 3.0.x + Rspec2 + Spork 0.9.0.rcX + Capybara + Devise + FactoryGirl
# spec/spec_helper.rb
Spork.prefork do
# This file is copied to spec/ when you run ''rails generate rspec:install''
ENV["RAILS_ENV"] ||= ''test''
require File.expand_path("../../config/environment", __FILE__)
require ''rspec/rails''
require ''capybara/rspec''
require ''capybara/rails''
# set "gem ''factory_girl'', :require => false" in Gemfile
require ''factory_girl''
# deal with Devise
require "rails/application"
Spork.trap_method(Rails::Application, :reload_routes!)
require File.dirname(__FILE__) + "/../config/environment.rb"
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
config.mock_with :rspec
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
# Devise controller test helpers:
config.include Devise::TestHelpers, :type => :controller
end
end
Spork.each_run do
# deal with factory girl
Factory.definition_file_paths = [File.join(Rails.root, ''spec'', ''factories'')]
Factory.find_definitions
end
Tenga en cuenta que config.cache_classes = true
debe establecer en true
en el entorno de prueba, de lo contrario puede obtener errores de gemas como FactoryGirl.
Esto hizo que mis pruebas de modelo (especificaciones) se ejecutaran rápidamente y las "recarguen" cada vez que guardo un archivo y ejecuto rspec.
EDITAR: Si se está ejecutando en Ruby 1.9.3 puede probar una alternativa interesante: Zeus - https://github.com/burke/zeus