Случайная черта с FactoryBot - PullRequest
2 голосов
/ 20 марта 2019

Я бы хотел использовать 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

Возможно ли это сделать?

1 Ответ

0 голосов
/ 21 марта 2019

Работая над возможным ответом, я столкнулся с тем фактом, что trait выполняется только после того, как ему дан блок.Я поделюсь примером кода, на котором я был в данный момент, хотя, если вы протестируете его, у вас будут только активные или неактивные пользователи, но не оба.


Вы можете экспортировать логикуиз ваших черт в двух лямбдах и затем выберите один случайным образом:

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

Атрибут context в лямбде очень важен здесь, вы можете узнать больше об этом в этом ответе .

...