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
上記のように変更する事で無事にテストユーザーを作成する事ができます。