Help us understand the problem. What is going on with this article?

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

はじめに

こんにちわ!Ruby学習中のYukiと申します。
Rails Tutorialではminitest というテストフレームワークが使用されているのですが、現場ではRspecが使用されることが多いという記事をちらっと見つけたので、復習も兼ね,テストをRspecで記入しているのですが、その中でFactoryBotというGemを使用したのでここにまとめておきます。(今回はrspecでcontrollerをテスト作成する過程になります)

FactoryBotとは...


FactoryBotとは、テストデータの作成を手伝ってくれるGemです。
(以前はFactryGirlという名前でしたが変更されたようです。)
自力でテストデータを作成する事もできるようですが、FactryBotを使うと簡単に生成が可能になります。(便利ですねー!)

FactoryBotを使ってみる

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

factries/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

これで、userをrspecテストで利用することができます。
(FactoryBotを省略できるようにする方法もありますが今回は省略します)

other_userも定義したい。。。

Railsチュートリアルで、ログインユーザーが別のユーザーの変更を行う処理(#updateや#destroyなど)のテストをしたいのでother_userも定義していきます。

factries/user.rb
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とする必要があり、今回のように複数のユーザーを作る時には明示的クラスを指定しなければならないようです。故に、

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

とする事で、無事にテストユーザーを作成する事ができました。
これからも、学んだ事は積極的にアウトプットしていきますので少しでも参考になればと思います。

当方まだまだ学習中の身ですので、訂正等あればご指摘いただければと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした