gpt4 book ai didi

ruby - FactoryBot 的随机特征

转载 作者:太空宇宙 更新时间:2023-11-03 16:40:38 24 4
gpt4 key购买 nike

我想像这样使用 FactoryBot 随机返回特征:

FactoryBot.define do
factory :user do

[:active, inactive].sample

trait :active do
active { true }
...
end
trait :inactive do
active { false }
...
end
end
end

这样做:

(1..5).map{ |e| FactoryBot.build(:user) }.map(&:active?)
=> [true, false, false, true, false]

其实是这样的:

FactoryBot.define do
factory :user do
active { [true, false].Sample }
name { "name-#{SecureRandom.uuid}" }
birthday { active == true ? rand(18..99).years.ago - rand(0..365).days.ago : nil }
preferred_contact_method { active == true ? %w(phone email).sample : nil }
activated_at { active == true ? rand(1..200).days.ago : nil }
contact_phone_number { preferred_contact_method == "phone" ? "+33XXXXXXXXX" : nil }
contact_email { preferred_contact_method == "email" ? "toto@tati.com" : nil }
end
end

这有可能吗?

最佳答案

在寻找最终答案时,我发现 trait 仅在给定 block 后执行。我将暂时分享我正在使用的代码示例,尽管如果您对其进行测试,您将只有活跃用户或不活跃用户,而不会同时拥有这两种用户。


您可以在两个 lambda 中导出特征逻辑,然后随机选择一个:

trait_active = lambda do |context|
context.active { true }
#...
end
trait_inactive = lambda do |context|
context.active { false }
# ...
end

FactoryBot.define do
factory :user do
trait :active do
trait_active.call(self)
end
trait :inactive do
trait_inactive.call(self)
end
trait :schrodinger do
[trait_active, trait_inactive].sample.call(self)
end
end
end

lambda中的context属性在这里相当重要,大家可以看看more关于那个in this answer .

关于ruby - FactoryBot 的随机特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55268328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com