LoginSignup
5
4

More than 3 years have passed since last update.

[Rails][RSpec]FactoryBot でFaker を使うのは一意性制約のあるものだけでOK

Posted at

結論

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 を知ったので、使いたいばかりになっていましたが、
新しく勉強したことでも、
本当にそれを使う必要があるのかや、もっとシンプルにコードを書けないかを意識しようと改めて思いました。

Faker

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4