使用 factory_girl 中的参数从另一个特征调用特征
Call trait from another trait with params in factory_girl
我有一个相当矮胖的 Factory Girl 特征,它接受参数并创建 has_many 关系。我可以将该特征称为另一个特征的一部分,以干涸特征或在将特征传递给工厂时更容易将它们捆绑在一起。我不知道该怎么做的是当我从另一个特征调用它时如何将参数传递给一个特征,或者该怎么做。
例如
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
:with_price
特征需要与您正在设置的其他属性分开一行,即使用此:
trait :with_usd_price do
with_price
short_name: 'USD'
end
而不是这个:
trait :with_usd_price do
with_price short_name: 'USD'
end
我使用的是 factory_bot
4.8.2,以下是对我有用的:
trait :with_usd_price do
with_price
short_name 'USD'
end
我有一个相当矮胖的 Factory Girl 特征,它接受参数并创建 has_many 关系。我可以将该特征称为另一个特征的一部分,以干涸特征或在将特征传递给工厂时更容易将它们捆绑在一起。我不知道该怎么做的是当我从另一个特征调用它时如何将参数传递给一个特征,或者该怎么做。
例如
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
:with_price
特征需要与您正在设置的其他属性分开一行,即使用此:
trait :with_usd_price do
with_price
short_name: 'USD'
end
而不是这个:
trait :with_usd_price do
with_price short_name: 'USD'
end
我使用的是 factory_bot
4.8.2,以下是对我有用的:
trait :with_usd_price do
with_price
short_name 'USD'
end