Yanonoblog!

こつこつと

FactoryBot 生成時のNameErrorを解消する

はじめに

同じモデルのFactoryBotを複数扱う際に発生したエラーを解消する内容になります。

発生したエラー

テスト実行時に以下のエラーが発生。

Failure/Error: let!(:person) { create(:official_person) }

NameError:
  uninitialized constant OfficialPerson 

エラーの原因

OfficialPersonという名前のモデルが存在しない

このエラーは、OfficialPersonという名前のモデルがアプリケーション内に存在しない場合に発生します。

試したこと

FactoryBotで定義したofficial_personを確認

このエラーは、RSpecofficial_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モデルのインスタンスを作成することができ、エラーが解消されます。

おしまい

コメント

本記事の内容は以上になります!