Параметр Pass в атрибуте настройки при ассоциации в FactoryGirl
Я хочу передать параметр в factory, который будет использоваться для установки атрибута в связанной модели. Связанная модель создается в factory.
У меня есть модель транзакции со ссылкой "многие-ко-многим" с помощью таблицы соединений TxLink.
Я хочу вызвать link = FactoryGirl.create(:link_red_to_sub, sub: 10, red: 7)
, который создаст два объекта Transaction и TxLink, который свяжет их.
Я получаю ошибку в строке ассоциации ниже из-за units: sub
в конце. Ошибка "не определена". Я попробовал units: { sub }
(с скобками), но не кубик.
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
Ответы
Ответ 1
Помощник association
в factory_girl не может принимать динамические аргументы свойства, но вы можете использовать динамический атрибут для создания экземпляра ассоциации, но вы хотите:
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
Единственным недостатком этого является то, что ассоциации giver
и taker
будут использовать стратегию создания независимо от стратегии, с которой вы строите tx_link
с, что по сути означает, что attributes_for
и build_stubbed
won ' t работает правильно для tx_link
factory.
В приведенном ниже примере требуется версия 4.5.0.
Ответ 2
Развернувшись на Joe, чтобы разрешить разграничение между сборкой и create:
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