ruby-on-rails - sheet - factory bot tutorial
Pasar parámetro en la configuración de atributo en asociación en FactoryGirl (2)
Quiero pasar un parámetro a una fábrica que se usará para establecer el atributo en un modelo asociado. El modelo asociado se crea dentro de la fábrica.
Tengo un modelo de Transacción con un enlace de muchos a muchos a sí mismo a través de una tabla de unión TxLink. Quiero llamar a link = FactoryGirl.create(:link_red_to_sub, sub: 10, red: 7)
que creará dos objetos Transaction y un TxLink que vincula los dos.
Recibo un error en la línea de asociación a continuación debido a las units: sub
al final. El error es "rasgo no definido". Probé las units: { sub }
(con paréntesis) pero no dados.
factory :tx_link do
units "9.99"
factory :link_red_to_sub do
ignore do
sub 0
red 0
end
units { red }
association :giver, factory: :transaction, units: sub
association :taker, factory: :redemption, units: red
end
end
Ampliando la respuesta de Joe para permitir la diferenciación entre construir y crear:
factory :tx_link do
units "9.99"
factory :link_red_to_sub do
ignore do
sub 0
red 0
end
units { red }
giver { build(:transaction, units: sub) }
taker { build(:redemption, units: red) }
after(:create) do |link_red_to_sub|
link_red_to_sub.giver.save!
link_red_to_sub.taker.save!
end
end
end
El ayudante de association
en factory_girl no puede tomar argumentos de propiedad dinámicos, pero puede usar un atributo dinámico para crear una instancia de la asociación como quiera:
factory :tx_link do
units "9.99"
factory :link_red_to_sub do
transient do
sub 0
red 0
end
units { red }
giver { create(:transaction, units: sub) }
taker { create(:redemption, units: red) }
end
end
El único inconveniente de esto es que las asociaciones de giver
y taker
utilizarán la estrategia de creación independientemente de la estrategia con la que se esté creando tx_link
, lo que esencialmente significa que attributes_for
y build_stubbed
no funcionarán correctamente para la fábrica tx_link
.
El ejemplo que proporcioné requiere la versión 4.5.0.