我有一个相当厚实的工厂女孩特质,接受参数并创建一个has_many关系。我可以将这种特性称为另一种特性的一部分,以便将特性干涸或者在将它们传递给工厂时更容易将特征捆绑在一起。我不知道怎么做的是当我从另一个特征中调用它时,或者该怎样做时,如何将params传递给一个特征。
e.g。
FactoryGirl.define do
factory :currency do
name Forgery::Currency.description
sequence(:short_name) { |sn| "#{Forgery::Currency.code}#{sn}" }
symbol '$'
end
factory :price do
full_price { 6000 }
discount_price { 3000 }
currency
subscription
end
sequence(:base_name) { |sn| "subscription_#{sn}" }
factory :product do
name { generate(:base_name) }
type { "reading" }
duration { 14 }
trait :reading do
type { "reading subscription" }
end
trait :maths do
type { "maths subscription" }
end
trait :six_month do
name { "six_month_" + generate(:base_name) }
duration { 183 }
end
trait :twelve_month do
name { "twelve_month_" + generate(:base_name) }
duration { 365 }
end
factory :six_month_reading, traits: [:six_month, :reading]
factory :twelve_month_reading, traits: [:twelve_month, :reading]
trait :with_price do
transient do
full_price 6000
discount_price 3000
short_name 'AUD'
end
after(:create) do |product, evaluator|
currency = Currency.find_by(short_name: evaluator.short_name) ||
create(:currency, short_name: evaluator.short_name)
create_list(
:price,
1,
product: product,
currency: currency,
full_price: evaluator.full_price,
discount_price: evaluator.discount_price
)
end
end
trait :with_aud_price do
with_price
end
trait :with_usd_price do
with_price short_name: 'USD'
end
end
end
create(:product, :with_aud_price) # works
create(:product, :with_usd_price) # fails "NoMethodError: undefined method `with_price=' for #<Subscription:0x007f9b4f3abf50>"
# What I really want to do
factory :postage, parent: :product do
with_aud_price full_price: 795
with_usd_price full_price 700
end
答案 0 :(得分:13)
:with_price
特征需要与您正在设置的其他属性分开,即代替:
trait :with_usd_price do
with_price short_name: 'USD'
end
使用此:
trait :with_usd_price do
with_price
short_name: 'USD'
end
答案 1 :(得分:0)
我在factory_bot
4.8.2上,以下内容对我有用:
trait :with_usd_price do
with_price
short_name 'USD'
end