Pase el parámetro al establecer el atributo en la asociación en FactoryGirl
Frecuentes
Visto 17,943 veces
30
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 link = FactoryGirl.create(:link_red_to_sub, sub: 10, red: 7)
que creará dos objetos Transaction y un TxLink que vincula a los dos.
Recibo un error en la siguiente línea de asociación debido a la units: sub
al final. El error es "rasgo no definido". Lo intenté units: { sub }
(con corchetes) en su lugar, pero sin 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
2 Respuestas
38
La association
helper en factory_girl no puede tomar argumentos de propiedades dinámicas, pero puede usar un atributo dinámico para instanciar la asociación como desee:
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 el giver
y taker
las asociaciones usarán la estrategia de creación independientemente de la estrategia que estés construyendo tx_link
con, lo que esencialmente significa que attributes_for
y build_stubbed
no funcionará correctamente para el tx_link
fábrica.
El ejemplo que proporcioné requiere la versión 4.5.0.
respondido 04 mar '15, 15:03
26
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
Respondido 15 ago 13, 22:08
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ruby-on-rails ruby-on-rails-3 rspec factory-bot or haz tu propia pregunta.
ignorar está en desuso. En su lugar, deberíamos usar "transitorio" - hcarreras