はじめに
タイトルの通り、RspecでダミーデータをFakerを用いて作成しようとしたところ、単純な理解不足でエラーが起きて一瞬詰まったので備忘録として残します。
同じようなミスをしている人がもしかしたらいるかもしれないので!!
行いたかったこと
user_name(ユーザー名)のダミーデータを作成がしたくて、下記のように記述したのですが、"国際化エラー:翻訳に失敗しました"というようなエラーが返ってきてしまいました。
FactoryBot.define do
factory :user do
user_name { Faker::Name.user_name }
#user_nameのダミーデータを作成したかったがエラーが発生
~省略~
end
end
#返ってきたエラー
I18n::MissingTranslationData:
translation missing: en.faker.name.user_name
ネットでエラーについて調べたところ、翻訳ミスなのでconfig/initializers/locale.rbのファイルを修正しましょうという記事があったのですが、エラーが変わらず返ってきて解決できませんでした。
そもそもFakerの仕組み
公式ドキュメントのREADME.mdを読んだら理解ができました。
僕は勝手に"Faker::Name + カラム名"でダミーデータが作成できると勘違いしていたのですが、
実際はそうではなく、Fakerがデフォルトで準備しているメソッドをFaker::~で呼び出せる、というものでした。
(表現が間違っていたらご指摘いただけると幸いです)
自分が公式ドキュメントを読んで理解した構文は下記です。
{}内は、Fakerのgithubの絶対パスで表現しています。
※こちらクリックをすれば、github(Faker)の絶対パスのページが表示されます。
faker/doc
faker/doc/~
#例としてgamesのフォルダを選択しています
faker/doc/~/~
#例として、games/super_mario.mdを選択しています。
Faker::{faker/docの項目名}::{faker/doc/~の項目名}.{faker/doc/~/~の項目名}
=> 例:Faker::Games::SuperMario.game #=> "Super Mario Odyssey"
#Faker/docでdefaultを選択する場合は記述する必要なし
Faker::{faker/doc/defaultの項目名}.{faker/doc/default/~}
=> 例:Faker::Name.name #=> "Tyshawn Johns Sr."
複数の例
要はFakerが項目ごとに複数準備してくれている文字列をランダムで準備してくれているということでした。
※ちなみに{faker/doc/~/~の項目}にも下記のように複数の選択肢があります。
# 名前だけ
Faker::Name.name #=> "Tyshawn Johns Sr."
# ミドルネームもある名前
Faker::Name.name_with_middle #=> "Aditya Elton Douglas"
# ファーストネームのみ
Faker::Name.first_name #=> "Kaci"
# スーパーマリオのキャラクター
Faker::Games::SuperMario.character #=> "Luigi"
# スーパーマリオのゲーム
Faker::Games::SuperMario.game #=> "Super Mario Odyssey"
# スーパーマリオのエリア
Faker::Games::SuperMario.location #=> "Kong City"
解決したコード
Fakerの仕組みがわかると理由は一目瞭然でした。
user_nameなんてものはFaker内にないので、エラーを吐いていました。
(一応色々やれば、自前でカスタマイズもできるみたいです。)
なので、下記のように修正すればすんなりとダミーデータを作ってくれました。
FactoryBot.define do
factory :user do
user_name { Faker::Name.name }
#user_nameのダミーデータを作成したかったがエラーが発生
~省略~
end
end
一応整理するとこんな感じに記述すればOKってことですね。
FactoryBot.define do
factory :モデル名 do
カラム名 { Faker内にある項目 }
~省略~
end
end
終わりに
なんとなくで理解したつもりになって、書いちゃだめってことですね。
仕組みを理解すれば簡単でした。
※間違っている箇所があればご教示いただけるとありがたいです。
参考