ruby on rails - rails - Problema de Spork y cache_classes con rspec, factory_girl y datamapper
factorybot gem (3)
Tengo un problema con el servidor de prueba Spork.
Si configuro config.cache_classes = false en config / environments / test.rb, las especificaciones comienzan a generar errores.
Failure/Error: task = Factory(:something, :foo => @foo, :bar => @bar)
DataMapper::ImmutableError:
Immutable resource cannot be modified
Este es mi spec_helper.rb:
require ''spork''
Spork.prefork do
if ENV[''CODE_COVERAGE''] == ''1''
require ''simplecov''
SimpleCov.start ''rails''
end
ENV["RAILS_ENV"] ||= ''test''
require File.expand_path("../../config/environment", __FILE__)
require ''rspec/rails''
require ''webmock/rspec''
require ''factory_girl''
Dir[Rails.root.join("spec/controllers/shared/*.rb")].each { |f| require f }
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
RSpec.configure do |config|
config.mock_with :mocha
config.include Rails.application.routes.url_helpers
config.include UrlHelper
config.before(:each) do
repository(:default) do
transaction = DataMapper::Transaction.new(repository)
transaction.begin
repository.adapter.push_transaction(transaction)
end
end
config.after(:each) do
repository(:default).adapter.pop_transaction.try(:rollback)
end
end
end
# This code will be run each time you run your specs.
Spork.each_run do
# reload factories
Factory.definition_file_paths = Dir[File.join(Rails.root, "spec", "factories")]
Factory.find_definitions
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean
LoggedEvent.all.destroy!
end
Cuando tengo config.cache_classes = true, todo funciona bien, pero no me recarga los modelos, las clases de controladores, así que no veo ningún punto en el uso de spork en este caso.
Intenté agregar a spec_helper.rb algo así, cuando el caché es verdadero:
Spork.each_run do
Dir.glob("#{Rails.root}/app/models/*.rb").sort.each { |file| load file }
end
Pero no me gusta esta solución.
Solo agrega:
ActiveSupport::Dependencies.clear
hasta el final del bloque prefork. esto se encargará de limpiar los modelos.
Además, desea mover ese rspec configurar inclusiones a Spork.each_run, lo mismo ocurre con la necesidad de soporte de especificaciones y archivos compartidos.
Esto funciona, utilizo esta configuración en 2 proyectos sin problemas.
Prueba ActionDispatch :: Reloader
Además de configurar config.cache_classes = false
en config/environments/test.rb
, lo siguiente parece hacer que DataMapper y Spork jueguen bien para nuestro equipo:
Spork.each_run do
# Routes
MyApp::Application.reload_routes!
if Spork.using_spork?
# Reload all app files
ActionDispatch::Reloader.cleanup!
ActionDispatch::Reloader.prepare!
# All factories
FactoryGirl.reload
end
end
Hola, quería compartir lo que me ayudó a ejecutar la prueba nuevamente.
Resulta que tuve que agregar el truco shared_connection
ya que spork se quejaba de la pérdida de conexión.
Después de esto, tuve que cambiar la línea de dependency.clear
al final del bloque, ya que estaba almacenando en caché mis modelos.
Spork.each_run do
# ActiveSupport::Dependencies.clear # <-- moved this line at end of block as suggested by @solnic
ActiveRecord::Base.instantiate_observers
MyApp::Application.reload_routes!
FactoryGirl.reload
class ActiveRecord::Base
mattr_accessor :shared_connection
@@shared_connection = nil
def self.connection
@@shared_connection || retrieve_connection
end
end
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
ActiveSupport::Dependencies.clear # <-- line moved here
end if Spork.using_spork?