tutorial rails how factorybot example create bot ruby-on-rails factory-bot

ruby-on-rails - rails - rspec factory bot



FactoryGirl tiene muchas asociaciones con validaciĆ³n (3)

¿Wat? ¿Imposible? De ningún modo.

Solo cambia tu código a algo como esto:

after :build do |booking, evaluator| booking.orders << FactoryGirl.build_list(:order, evaluator.orders_count, booking: nil) end

Tengo una relación has_many estándar (la reserva tiene muchos pedidos) con la validación de que una reserva no se guarda sin al menos un pedido. Estoy tratando de replicar esto con mis fábricas de FactoryGirl pero la validación me impide hacerlo.

class Booking < ActiveRecord::Base has_many :orders validates :orders, presence: true end class Order < ActiveRecord::Base belongs_to :booking end

Aquí están las especificaciones de fábrica de mi FactoyGirl para cada modelo, como se indica en la página de wiki de GitHub de FactoryGirl.

FactoryGirl.define do factory :booking do factory :booking_with_orders do ignore do orders_count 1 end before(:create) do |booking, evaluator| FactoryGirl.create_list(:order, evaluator.orders_count, booking: booking) end end end factory :order do booking end end

Cuando intento ejecutar FactoryGirl.create(:booking_with_orders) desde mi especificación, obtengo:

Failure/Error: @booking = FactoryGirl.create(:booking_with_orders) ActiveRecord::RecordInvalid: Validation failed: Orders can''t be blank

Parece que la verificación de la validación se está ejecutando incluso antes before(:create) [...] que teóricamente crearía los pedidos para la reserva.

Esta publicación recomienda no agregar relaciones has_many a sus fábricas, pero me gustaría resolver esto de todos modos si hay una buena manera de hacerlo.

Gracias por adelantado.


Despegando de la respuesta de @jassa, si solo necesita agregar un único registro asociado (requerido) con un atributo específico, este patrón funcionó para mí:

factory :booking do ignore do order_name "name" end after :build do |factory, evaluator| factory.orders << FactoryGirl.build(:order, name: evaluator.order_name, booking: nil) end end


Esto parece una observación demasiado simplista, pero lo que está intentando hacer es, en efecto, asegurarse de que la Order exista antes de la Booking , lo cual es imposible, ya que la Order no puede existir sin su booking_id (lo que significa que la Booking debe crearse primero) ).

No hay nada malo con una relación has_many en sus fábricas, es su validación que es un problema. ¿Esto funciona actualmente en su aplicación? ¿Cómo guarda sus registros en ese caso? ¿Cuál es el flujo para crear Pedidos y Reservas?

Incluso el infame accepts_nested_attributes_for no te ayudará aquí.

Mi consejo es repensar su estrategia de validación y guardado de registros para que esté un poco más sano.