es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo probar las asociaciones belongs_to con Rails 6 y RSpec 4.1?

Estoy actualizando de Rails 4.2 a 6. También estoy utilizando FactoryBot 6.2.0. Tengo este modelo

class Book < ActiveRecord::Base
  belongs_to :author, inverse_of: :book
    …
  validates :model, presence: true, unless: -> { author.check_vwf? }

Tengo una prueba de RSpec (rspec-rails 4.1.2) en la que quiero probar una asociación…

describe Book do

    …
  it { should belong_to :author }

Pero al ejecutar esta prueba falla con el siguiente error. Parece que el método “validates” se está ejecutando y la instancia que se está construyendo no tiene una asociación “belongs_to”, pero eso es precisamente lo que estoy tratando de probar…

 Failure/Error: validates :model, presence: true, unless: -> { author.check_vwf? }

 NoMethodError:
   undefined method `check_vwf?' for nil:NilClass

Algo sobre la actualización de Rails hizo que esta prueba fallara de repente. ¿Cuál es la forma correcta, con la versión dada de Rails y RSpec, de probar una asociación?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que la prueba está fallando porque la validación en el modelo Book está intentando acceder a un método en un valor nulo para la asociación author. Esto podría significar que la asociación author no se está configurando correctamente en la prueba.

    Para probar correctamente la asociación en Rails 6 con FactoryBot 6.2.0 y RSpec 4.1.2, podemos usar el método de asociación de Factory Bot para crear un modelo Book con un modelo Author asociado.

    Aquí tienes un ejemplo de cómo podemos modificar la prueba para crear la asociación:

    describe Book do
      # Configura la fábrica para el modelo Author
      let(:author) { FactoryBot.create(:author) }
    
      # Usa FactoryBot para crear un modelo Book con un modelo Author asociado
      let(:book) { FactoryBot.create(:book, author: author) }
    
      # Prueba que el modelo Book pertenece a un Author
      it { should belong_to :author }
    end
    

    Con esta configuración, la variable author ahora se inicializa con una instancia válida de Author, que puede ser pasada a la fábrica book usando el atributo author. Esto creará una instancia válida de Book con un Author asociado correctamente.

    También podemos actualizar la validación del modelo Book para verificar la presencia de la asociación author:

    class Book < ApplicationRecord
      belongs_to :author, inverse_of: :book
      validates :model, presence: true
      validates_presence_of :author
    end
    

    Con estos cambios, la prueba debería pasar sin errores.

Comments are closed.