ソムリエでエンジニアのブログ

ワインの事も書きたいけど基本エンジニア用

FactoryBotでテストデータ作成する方法

はじめに

本記事は以前Qiitaに掲載していた内容です。
エンジニア転職を目指してRails Tutorialで学習を行なっていた際に、デフォルトで紹介されているminitestではなく、現場で利用されている事の多いRspecを利用してみました。
テストを作成する中でFactoryBotというGemを使用したので詰まったところなどまとめておきます。

記事の目的

Rspecを利用したテストデータ作成の基本を知る
Rspecで複数のテストユーザーを作成できるようになる

FactoryBotを使ってみる

テストデータを定義する

テストデータの定義は、specの配下にfactories/モデル名.rb のようなファイルを作成し、この中で定義していきます。今回はuserというテストデータを定義します。

-factories/user.rb

FactoryBot.define do
  factory :user do
    name { 'Yamada Tarou' }
    email { 'yamade@rails.com' }
    password { 'password' }
    password_confirmation { 'password' }
  end
end

テストデータを利用する

先程定義したテストデータを実際に利用していきましょう。
定義した内容をテストで利用するにはテストファイル内で以下のように記述していきます。

-rspec/controllers/users_controller_spec.rb

RSpec.describe UsersController, type: :controller do
  let(:user){ FactoryBot.create(:user) }
end

ユーザーを複数登録したい、、、

ログインユーザーが別ユーザーの情報を変更する事ができない事をテストする為、複数のユーザーをテストデータとして登録していきます。

FactoryBot.define do
  factory :user do
    name { 'Yamada Tarou' }
    email { 'yamade@rails.com' }
    password { 'password' }
    password_confirmation { 'password' }
  end
  factory :other_user, do
    name { 'Sato jirou' }
    email { 'sato@rails.com' }
    password { 'foobar' }
    password_confirmation { 'foobar' }
  end
end

=>NameError:
 uninitialized constact OtherUser

上記のように複数のユーザーを定義して実行するとエラーが出てしまいます。
FactoryBotデータを作成する際には、factory :モデル名 do ~ endとする必要があり、今回のように複数のユーザーを作る時には明示的クラスを指定しなければならないようです。

/省略/
factory :other_user, class: User do
    name { 'Sato jirou' }
    email { 'sato@rails.com' }
    password { 'foobar' }
    password_confirmation { 'foobar' }
    admin { 'false' }
  end
end

上記のように変更する事で無事にテストユーザーを作成する事ができます。