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.