tutorial rails girl factorybot create bot ruby-on-rails rspec datamapper spork factory-bot

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?