13

ロール モデルに属するアカウント モデルがあります。

factory :role do
  name "student"
end

factory :account do
  user
  role
end

最初のファクトリは、「student」という名前のロールを作成します。2 番目のファクトリは、前のファクトリで作成された学生の役割に関連付けられているアカウントを作成します。また、ユーザーに関連付けられています...この質問では重要ではありません。

テストするロールがたくさんあります (管理者、学生、アシスタント)...ロール ファクトリで「学生」を指定したくありません...静的すぎます。アカウント ファクトリの作成時に作成するロールを指定するにはどうすればよいですか? お気に入り:

  factory :account do
    user
    role_id { factory :role { name: "admin"} }
  end

これを達成するための最良の方法は何ですか?

4

1 に答える 1

31

純粋な FG ソリューションが必要な場合は、Traits を使用できます。

factory :account do
  user

  trait :student do
    association :role, :name => "student"
  end

  trait :admin do
    association :role, :name => "admin"
  end
end

FactoryGirl.create :account, :student
FactoryGirl.create :account, :admin

ただし、ファクトリ オブジェクトを作成するときに、ファクトリのプロパティをオーバーライドできます。これにより、柔軟性が向上します。

FactoryGirl.create(:account,
  :role => FactoryGirl.create(:role, :name => "student")
)

これは明らかに冗長なので、ちょっとしたヘルパー メソッドを作成します。

def account_as(role, options = {})
  FactoryGirl.create(:account,
    options.merge(:role => FactoryGirl.create(:role, :name => "student"))
  )
end

次に、テストで:

let(:account) { account_as "student" }

または、次のように使用できるように、ロールジェネレーターを短くすることもできます。

def role(role, options = {})
  FactoryGirl.create :role, options.merge(:name => role)
end

account = FactoryGirl.create :account, :role => role("student")
于 2012-12-30T18:32:29.240 に答える