FactoryBot 生成時のNameErrorを解消する
はじめに
同じモデルのFactoryBotを複数扱う際に発生したエラーを解消する内容になります。
発生したエラー
テスト実行時に以下のエラーが発生。
Failure/Error: let!(:person) { create(:official_person) } NameError: uninitialized constant OfficialPerson
エラーの原因
OfficialPersonという名前のモデルが存在しない
このエラーは、OfficialPersonという名前のモデルがアプリケーション内に存在しない場合に発生します。
試したこと
FactoryBotで定義したofficial_personを確認
このエラーは、RSpecがofficial_personという名前のFactoryBotの定義を見つけられない場合に発生します。
ただ、定義済みではあったので原因ではさそうです。
FactoryBot.define do factory :official_person do name { "公式メンバー" } end end
試しにクラスを定義してみた
名前がないというエラーだったため、クラスを定義してみたところ同様のエラーが解消されていることを確認できました。
FactoryBotでただ名前を定義した場合では、クラスを参照できないとエラーになることがわかりました。
# frozen_string_literal: true class **OfficialPerson** < ApplicationRecord end
ただし、factoryを複数生成するためにモデルを追加したり既存のモデルに追記するのは控えたいところ。
FactoryBotのオプションを調べて解決に進めます。
解決
FactoryBotの定義を見直し、classオプションにPersonモデルを指定することで解消しました。
FactoryBot.define do factory :official_person, class: Person do name { "公式メンバー" } end end
エラーメッセージuninitialized constant OfficialPersonは、OfficialPersonという名前の定数(ここではモデルやFactoryの名前)が見つからないという意味です。
Factoryの定義ではclass: Personと指定することで、このFactoryがPersonモデルに対して定義されていることを明示しています。
上記のように修正することで、create(:official_person)というコードがPersonモデルのインスタンスを作成することができ、エラーが解消されます。
おしまい
コメント
本記事の内容は以上になります!