【Ruby】テストコードを書く際のダミー生成について

ブログ開設初日、さっそくアウトプットしがいのあるエラーに遭遇したので記しておきます。
今回は表題の通り、テストコードを書く際のダミー生成について。
いつもFakerを使っているのですが、今までの知識だけでは上手くいかないことがでてきました。


・問題点・
①氏名・氏名(カナ)それぞれバリデーション設定をしているため、{Faker::Name}でダミー生成するとバリデーションエラーを起こす

ActiveRecord::RecordInvalid: Validation failed: First name is invalid,
Last name is invalid, First name kana is invalid, Last name kana is invalid

②誕生日を設定したいが、日付のダミー生成がわからない

ActiveRecord::NotNullViolation: Mysql2::Error: Field 'birth_date' doesn't have a default value

・目標着地点・
①氏名・氏名(カナ)をそれぞれ漢字/カナでダミー生成
②誕生日(日付)のダミー生成


・内容・
①漢字・カナのダミー生成方法
Fakerでは、英数字のみのダミー生成しかできないそう。
そこで使用するGEMがgimeiです。
日本語名の氏名・カナ氏名、住所のダミーを作れるんですね。始めて知りました。
gemインストールのためにGemfileを編集します。

~~中略~~
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'faker'
  gem 'gimei'
end
~~中略~~

bundle installしたら、FactoryBotの内容を定義しているファイル内に以下を記述します。

FactoryBot.define do
  factory :user do
    transient do
      person {Gimei.name}
    end
    name {Faker::Name.last_name}
    email {Faker::Internet.free_email}
    password = Faker::Internet.password
    password {password}
    password_confirmation {password}
    last_name {person.last.kanji}
    first_name {person.first.kanji}
    last_name_kana {person.last.katakana}
    first_name_kana {person.first.katakana}
  end
end

まず3〜5行目でGimeiが使えるよう記述します。(こちらの記事を参考にさせていただいております。)
そしたら11〜14行目にあるように、ダミー生成のコードを記述していきます。
これで以下の結果が得られました

User Create (44.2ms)  INSERT INTO `users` (`email`, `encrypted_password`, `name`, `last_name`, `first_name`, `last_name_kana`, `first_name_kana`, `created_at`, `updated_at`) VALUES ('tai.oreilly@yahoo.com', '$2a$12$HsHYj9HkVDZ8hfDyfeOqH.wYen25CiM3aHZ6uOGyX.y7Iou0ggDha', 'Rice', '萩原', '更奈', 'サラナ', 'ハギハラ', '2021-02-24 06:39:00.988217', '2021-02-24 06:39:00.988217')

※一部記述ミスで苗字・名前が逆になっていますが、変更後一発目の結果ということでこちらを掲載しています。

②日付の生成方法 こちらについては、Fakerで対応できるとのこと。今まで使わなかったとはいえ、圧倒的勉強不足を痛感…!!!
こちらにばっちり記載されていました。
こちらを参考に、しっかりとコードに落とし込みました。

FactoryBot.define do
  factory :user do
    transient do
      person {Gimei.name}
    end
    name {Faker::Name.last_name}
    email {Faker::Internet.free_email}
    password = Faker::Internet.password
    password {password}
    password_confirmation {password}
    last_name {person.last.kanji}
    first_name {person.first.kanji}
    last_name_kana {person.last.katakana}
    first_name_kana {person.first.katakana}
    birth_date {Faker::Date.birthday(min_age: 20, max_age: 90)} #追記
  end
end

上記内容を記載後に得られた結果がこちらです。

User Create (0.3ms)  INSERT INTO `users` (`email`, `encrypted_password`, `name`, `last_name`, `first_name`, `last_name_kana`, `first_name_kana`, `birth_date`, `created_at`, `updated_at`) VALUES ('delta_blanda@gmail.com', '$2a$12$samJVqVnqM9Rjs5yAj5Qpu3MH5yy9DU27YQDu412LEHGv8k1a5x7i', 'Gorczany', '岸本', '紋季', 'キシモト', 'アキ', '1950-12-15', '2021-02-24 06:56:08.182377', '2021-02-24 06:56:08.182377')

以上で無事目標着地点到達です。


さて、今回はテストコードに使用する際のダミー生成について、Faker及びGimeiを使っていきました。
Fakerが生成できるダミーはたくさんありそうで、いろいろ使ってみたくなりますね…!
pokemonがあったのが特に気になるポイントなので、オリジナルアプリを作る際にいろいろと休憩がてら遊んでみたいと思います。

今回参考にした記事はこちらです。ありがとうございました。(記事に差し込んであるリンク先も、改めてこちらに掲載しております。)

  • Faker
  • Faker-ruby
  • テストコードを書くときに、ランダムで情報を生成したい