値の設定

コンソールで試行錯誤するとき、系列を特定の値に設定できると、大変便利です。 これはFactoryBot.set_sequence系列URIと新しい値を渡すと実現できます。

大域系列

大域系列は系列名と新しい値で設定されます。

FactoryBot.define do
  sequence(:char, 'a') {|c| "global_character_#{c}" }

  factory :user do
    sequence(:name, %w[Jane Joe Josh Jayde John].to_enum)

    trait :with_email do
      sequence(:email) {|n| "user_#{n}@example.com" }
    end
  end
end

##
# 文字
generate(:char) # "global_character_a"
FactoryBot.set_sequence(:char, 'z')
generate(:char) # "global_character_z"

##
# 利用者名
generate(:user, :name) # "Jane"
FactoryBot.set_sequence(:user, :name, 'Jayde')
generate(:user, :name) # "Jayde"

##
# 利用者のEメール
generate(:user, :with_email, :email) # "user_1@example.com"
FactoryBot.set_sequence(:user, :with_email, :email, 1_234_567)
generate(:user, :with_email, :email) # "user_1234567@example.com"

補足

  • 新しい値は系列の要素の集合に合致しなければなりません。 Integerベースの系列にStringを渡すことはできません!

  • 整数ベースの系列、例えばレコードIDは、値として任意の正の整数を受け付けます。

  • 取り得る要素が決まっている集まりの系列は、その中にある任意の値を取れます。

  • 無制限の系列、例えば文字のsequence(:unlimited,'a')は、既定の最大の探索時間である3秒内に見つからなければ、時間切れになります。

  • 時間制限を構成できます:FactoryBot.sequence_setting_timeout = 1.5