【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内で呼び出される毎に属性値が変わったりはしない