系列

factory_botは2つの水準の系列に対応しています。 大域的なものとファクトリ固有のものです。

大域系列

Factory.defineブロックでは、sequenceメソッドを使うと、他のファクトリで共有できる大域系列が定義されます。

sequenceメソッドは、名前、省略できる実引数、ブロックを取ります。 名前はSymbolにすることになっています。

対応する実引数は、開始の値を表す数値(既定で1)と:aliases(既定で[])です。 開始の値は#nextに応答しなければなりません。

ブロックは値を実引数として取り、結果を返します。

系列の値は大域的に増加します。 複数の場所で:email_address系列を使うと、都度値が漸増します。

早道についてはmethod_missingを参照してください。

ファクトリ系列

系列はファクトリブロック内に留めておけます。 構文は大域系列と同じですが、漸増する値のスコープはファクトリ定義に限られます。

加えてfactoryブロックでsequenceを使うと、暗黙にその値にadd_attributeを呼びます。

以下の2つは似ていますが、2つ目の例は大域系列が存在しません。

# 大域系列
sequence(:user_factory_email) { |n| "person#{n}@example.com" }

factory :user do
  # 大域系列を使う
  email { generate(:user_factory_email) }
end
# ファクトリのスコープの系列
factory :user do
  sequence(:email) { |n| "person#{n}@example.com" }
end