13

次のように定義された (単純化された) ファクトリがあります。

factory :league do
  acronym 'NBA'
end

factory :division do
  league
end

ディビジョンはリーグに属します。このファクトリを定義するとき、1 つのリーグが作成され、そのリーグが何度も再利用されてディビジョンに実際の League_id が与えられると想定していました。

FactoryGirl.create(:division)代わりに、リーグacronymが一意であると想定されているため、2 回目の呼び出しでエラーが発生します。

class League < ActiveRecord::Base
  validates :acronym, uniqueness: true
end

次のテストの中断につながる

ActiveRecord::RecordInvalid: 検証に失敗しました: 頭字語は既に使用されています

できればテストのセットアップで階層を作成せずに、これを回避するにはどうすればよいですか?

私が達成しようとしていることに対して factory_girl よりも優れたものがあれば、それを提案してください

4

2 に答える 2

7

initialize_withリーグ定義で使用します。

http://robots.thoughtbot.com/post/16196616388/factory-girl-2-5-gets-custom-constructorsを参照してください。

find_or_create_by_acronymその後、一度作成されたことを保証するために発行できます。

于 2013-05-24T02:00:37.890 に答える
4

どこで FactoryGirl.create を呼び出しているかによって、持っているすべての仕様に対してレコードが作成されます。必要なのはdatabase_cleaner、セットアップが完了すると、すべての仕様の後にデータベースがクリーンアップされ、検証エラーが問題にならないようにすることです。

編集

おっと、私はあなたの質問を読み違えました。あなたがしたいことは、faker宝石を使用して頭字語ごとにランダムな文字列を生成するかfactory_girl、このようなシーケンスを使用することです

FactoryGirl.define do
  sequence :acronym do |n|
    "NBA#{n}"
  end

  factory :league do
    acronym
  end
end

シーケンスを使用すると、実際には、作成されたすべてのリーグに固有の頭字語が確実に付けられます。

于 2013-05-24T02:00:19.780 に答える