結論
FactoryBot でインスタンスを生成する時に、
Faker でランダムな値を出力するのは一意性制約のあるものだけでOK というお話です。
背景
RSpec使ったテストコードについて学んでいる中で、
FactoryBot であらかじめインスタンスをまとめておける、
Faker でランダムな値を生成できると知り、
Faker を使うのが楽しくなってこんな感じでユーザー登録用のFactoryBot の記述をしていました。
spec/factories/users.rb
FactoryBot.define do
factory :user do
transient do
gimei { Gimei.name } # gem 'gimei'を用いて漢字氏名とフリガナを生成する
end
nickname { Faker::Name.first_name }
email { Faker::Internet.free_email }
password = 'test1234'
password { password }
password_confirmation { password }
family_name { gimei.last.kanji }
first_name { gimei.first.kanji }
kana_family_name { gimei.last.katakana }
kana_first_name { gimei.first.katakana }
birthday { Faker::Date.between(from: '1930-01-01', to: '2016-12-31') }
end
そんな時にコードレビューしていただいた方から、
「FactoryBot ではバリデーションにひっかからず登録できる情報が作れれば良いので、
Faker はemail等の一意性制約をかけているものだけ使えばOK ですよー。」
とコメントを頂きました。
なるほどと思い、書き直したのがこちらです。
spec/factories/users.rb
FactoryBot.define do
factory :user do
nickname { 'テスト用ユーザー' }
email { Faker::Internet.free_email }
password = 'test1234'
password { password }
password_confirmation { password }
family_name { '佐藤' }
first_name { '太郎' }
kana_family_name { 'サトウ' }
kana_first_name { 'タロウ' }
birthday { '1970-01-01' }
end
end
ユーザー登録にemail だけは一意性制約をかけているのでFaker を使い、
他は重複しても問題無いので直接記述しています。
こちらの方が断然読みやすくなりました。
学んだこと
この時新しくFaker を知ったので、使いたいばかりになっていましたが、
新しく勉強したことでも、
本当にそれを使う必要があるのかや、もっとシンプルにコードを書けないかを意識しようと改めて思いました。