【RSpec】ファクトリの作成

factoriesファイルを編集

以下のようにデフォルト値を設定する

# spec/factories/students.rb

FactoryBot.define do
  factory :student do
    sequence(:name) { |n| "Student#{n}" }
    sequence(:email) { |n| "student#{n}@test.com" }
    password { '12345678' }
    password_confirmation { '12345678' }
    grade { Student.grades.keys.first }
    association :school
  end
end
  • sequenceでファクトリごとに異なる属性値を与える。
    • 明示的に異なる値を指定しないと、一度に複数のファクトリを作るときに全部同じになっちゃう
  • enumの属性を与えるときは keys で変数名の配列を取得。
    • 変数名が変わったときに対応できる
  • associationで関連を扱う
  • パスワード関連は全てのファクトリで共通のわかりやすい値でよい
    • 認証の仕方によってはstudent.passwordのような呼び出し方ができないため
fill_in 'パスワード', with: student.password # ERROR
fill_in 'パスワード', with: '12345678'  # OK

ファクトリの作成

※FactoryBot.createの省略形

s = create(:student)
s = create(:student, grade: '二年') # 属性値のカスタム
letによる遅延呼び出し
let(:mike) { create(:student, name: 'Mike')
it 'xxx' do
  ...

example中で変数mikeが初めて呼び出されたときに作成される。

  • 同じexample内では最初に呼び出された値を使い回すが、違うexampleでは再度呼び直す
  • つまりsequenceを使っていても、同じexample内で呼び出される毎に属性値が変わったりはしない