系列URI

特定の系列を操作したい理由は沢山あります。

  • 単一の値を生成:generate
  • 複数の値を生成:generate_list
  • FactoryBot.rewind_sequencesで新しい値に設定
  • 巻き戻し:rewind_sequence

これを達成するには、所望の系列を参照できる必要があります。 これはその系列の一意なURIで実現できます。

URI合成

各URIは3つの名前が組み合わさったものです。

位置名前必要かどうか
1.ファクトリ名条件付き - 系列はファクトリないしファクトリトレイト内で定義されます
2.トレイト名条件付き - 系列はトレイト内で定義されます
3.系列名必ず必要

URIは個々のシンボルとして入力されます。

generate(:my_factory_name, :my_trait_name, :my_sequence_name)

あるいは 個々の文字列として入力されます。

generate('my_factory_name', 'my_trait_name', 'my_sequence_name')

あるいは 単一のリソース文字列として入力されます。

generate("my_factory_name/my_trait_name/my_sequence_name")

完全なURIの例

以下の例では詳しく全てのあり得るシナリオを説明しています。 コメントでは、それぞれの系列の値を生成するのに使われるURIを示しています。

FactoryBot.define do
  sequence(:sequence) {|n| "global_sequence_#{n}"}
  # generate(:sequence)

  trait :global_trait do
    sequence(:sequence) {|n| "global_trait_sequence_#{n}"}
    # generate(:global_trait, :sequence)
  end

  factory :user do
    sequence(:sequence) {|n| "user_sequence_#{n}"}
    # generate(:user, :sequence)

    trait :user_trait do
      sequence(:sequence) {|n| "user_trait_sequence_#{n}"}
      # generate(:user, :user_trait, :sequence)
    end

    factory :author do
      sequence(:sequence) {|n| "author_sequence_#{n}"}
      # generate(:author, :sequence)

      trait :author_trait do
        sequence(:sequence) {|n| "author_trait_sequence_#{n}"}
        # generate(:author, :author_trait, :sequence)
      end
    end
  end
end

複数URI

1つの系列に複数のURIを持たせることができます。

ファクトリやトレイトに別称があるとき、系列はそれぞれの別称、また別称の組み合わせ毎に、追加でURIを持ちます。

この例では、同じ系列を4つの異なる方法で参照できます。

factory :user, aliases: [:author] do
  trait :user_trait, aliases: [:author_trait] do
    sequence(:sequence) {|n| "author_trait_sequence_#{n}"}
  end
end

# generate(:user,   :user_trait,   :sequence)
# generate(:user,   :author_trait, :sequence)
# generate(:author, :user_trait,   :sequence)
# generate(:author, :author_trait, :sequence)

重要

  • どれだけ深く入れ子になっていても、URIのファクトリ名の構成要素は常に、その系列が定義されているファクトリです。 決して親ファクトリではありません。

  • ファクトリが系列を継承するとき、URIはそれが定義されたファクトリを参照しなくてはなりません。 使われているファクトリではありません。