tutorial sheet rails factorybot example cheat bot association ruby-on-rails ruby-on-rails-3 rspec factory-bot

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.