tutorial rails factorybot example bot association ruby-on-rails ruby-on-rails-3 cucumber factory-bot

ruby on rails - rails - AssociationTypeMismatch y FactoryGirl



factorybot association (7)

Esto sucede porque cache_classes es falso, como lo requiere Spork. Capybara recarga las clases de Rails para cada solicitud (o, para ser correcto, el middleware de recarga de Rails lo hace, lo que no se llama para pruebas normales), y esto asusta a las fábricas (exactamente por qué, no estoy seguro). Puede volver a cargarlos, o simplemente ejecutar sus especificaciones de Capybara fuera de Spork.

Por lo tanto, necesita dos cosas: ejecutar solo Capybara fuera de Spork, y configurar cache_classes en false solo para Spork.

Para ejecutar solo Capybara fuera de Spork, tengo un Guardfile que ejecuta especificaciones en especificaciones / solicitudes fuera de Spork y otras especificaciones dentro de Spork aquí:

https://gist.github.com/1731900

Luego, en config/environments/test.rb :

config.cache_classes = !ENV[''DRB'']

Las especificaciones de su Capybara serán un poco más lentas, ya que necesitan arrancar los rieles, pero todo funcionará.

Esto ha estado causando alguna frustración recientemente ...

Parece que el uso de Fábricas en mis pruebas de pepino, en algunas situaciones provoca errores AssociationTypeMismatch como:

MyModel (# 65776650) esperado, tengo MyModel (# 28190030) (ActiveRecord :: AssociationTypeMismatch)

Esto parece ocurrir cuando hay una referencia de asociación, como si el objeto creado en la fábrica fuera diferente al real. Vea esta pregunta para obtener más detalles: Problema de clase de duplicado de pepino: AssociationTypeMismatch

He ido cambiando gradualmente las llamadas de Factory a llamadas Model.create o mock_model reales. Sería bueno seguir usando Factory girl ... Me pregunto si hay algo que pueda haber hecho mal.

Gracias


Me encontré con este mismo problema y probablemente pasé diez horas probando cada solución en este hilo y en cualquier otro lugar de la web. Comencé a arrancar enormes trozos de código intentando acercarme a otra aplicación mía en la que no podía reproducir el problema. Finalmente, encontré algunas funciones de ayuda en mi archivo spec_helper:

def sign_in(user) visit signin_path fill_in "Email", with: user.email fill_in "Password", with: user.password click_button "Sign in" # Sign in when not using Capybara as well. cookies[:remember_token] = user.remember_token if defined?(cookies) end

Un ayudante sign_in destinado a trabajar tanto en el controlador como en solicitar especificaciones. Y lo hace, más o menos, pero no con Spork. Cuando quité los ayudantes de capibara, el problema se resolvió:

def sign_in(user) cookies[:remember_token] = user.remember_token end


Me encontré con este problema cuando pasé la opción "clase" a mi fábrica que fue heredada por otras fábricas:

factory :draft_resource, :class => Resource do factory :resource, :parent => :draft_resource do

La única solución que pude encontrar fue simplemente no hacer esto.


Me sucedió esto en Rails 3.1.0 rc5 y lo hice funcionar.

Para ampliar la respuesta de Jonas.

Debes cambiar tu Gemfile para ser así:

gem ''factory_girl'', ''~> 2.0.0'', :require => false gem ''factory_girl_rails'', ''~> 1.1.0'', :require => false

Y luego, si está utilizando Spork, haga que su archivo spec / spec_helper.rb tenga este aspecto:

Spork.each_run do require ''factory_girl'' require ''factory_girl_rails'' end


Parece que sucede si ActiveSupport descarga y vuelve a cargar una constante a la que tiene una referencia. He experimentado lo mismo con Rspec / Capybara, y lo que ayudó fue una mezcla de diferentes cosas:

  • Asegúrese de tener cached_classes configuradas como falsas en su entorno de prueba (config / environment / test.rb)
  • En tu gemspec, intenta reemplazar requiere ''factory_girl_rails'' con ''factory_girl''

Estoy usando Spork (un servidor de prueba), lo que parece hacer esto cada vez más difícil. Si está utilizando un servidor de prueba, evalúe si debe poner '',: require => false'' después de factory_girl en su gemspec.

El tema también se trata en este hilo de grupos de Google.

Por favor, háganos saber si algo de esto ayudó.


Si está utilizando Spork, asegúrese de volver a cargar sus fábricas después de volver a cargar sus modelos.

P.ej

Spork.each_run if Spork.using_spork? print "Reloading models ... " ActiveSupport::Dependencies.clear puts "done" print "Reloading factories ... " FactoryGirl.reload puts "done" end end


Tuve un poco de éxito con la recarga de las definiciones de Fábrica, intente algo como esto:

class Factory def self.reload_definitions #:nodoc: self.factories.clear definition_file_paths.each do |path| load("#{path}.rb") if File.exists?("#{path}.rb") if File.directory? path Dir[File.join(path, ''*.rb'')].each do |file| load file end end end end end