【初心者向け】factory_botを利用したダミーデータの作成方法


factory_botとは

簡単にダミーのインスタンスを作成することができるGemです。他のファイルで予め各クラスのインスタンスに定めるプロパティを設定しておき、specファイルからメソッドを利用してその通りのインスタンスを作成します。

導入方法

Gemfileに以下のように記載

Gemfile
group :development, :test do
  #省略
  gem 'factory_bot_rails'
end

bundle installします。

specディレクトリ内に’factories’というディレクトリを作成し、(今回はuserのテストをするので)users.rbというファイルを作成します。

factory_bot を使ってuserを定義する

先ほど作成したfactories/users.rb 内にダミーのuserを定義します。

factories/users.rb
FactoryBot.define do
  factory :user do
    name                  {"tanu"}
    email                 {"[email protected]"}
    password              {"11111111"}
    password_confirmation {"11111111"}
  end
end

定義したuserをテスト内で使う

先に定義したuserは下記のように使用します。

spec/model/user_spec.rb
describe User do
  describe '#create' do
    it 'is invalid without a name' do
      user = FactoryBot.build(:user, name: nil)
      user.valid?
      expect(user.errors[:name]).to include("を入力してください")
    end
  end
end

これは、下記の内容と一緒です。(下記は、factory_botを使用しないで、同じ内容を記述した例)

describe User do
  describe '#create' do
    it 'is invalid without a name' do
      user = User.new(name: "", email: "[email protected]", password: "11111111", password_confirmation: "11111111")
      user.valid?
      expect(user.errors[:name]).to include("を入力してください")
    end
  end
end

なお、

user = FactoryBot.build(:user, name: nil)

FactoryBotは省略可能で、上記は、

user = build(:user, name: nil)

と書くこともできます。

buildメソッドとcreateメソッド

factory_botのメソッドのうち

  • build ... インスタンスを生成するメソッド。newと同じ
  • create ... データのsaveまでを行う。ただし、saveされたデータは、1回のテストが終わったら消えてしまう。

という特徴がそれぞれあるそうです。

レシーバーの"FactoryBot"という記述を省略する

さらに、rails_helperに下記のような記述をしておくことで、"FactoryBot"という記述は省略できるそうです。

spec/rails_helper.rb

RSpec.configure do |config|
  #下記の記述を追加
  config.include FactoryBot::Syntax::Methods
  #省略
end

上記の記述によって、テストの記述は下記のように省略できます。

user = build(:user, name: nil)

テストはしっかり学習しておくように周りから色々なアドバイスを受けるのですが、なかなか奥が深いですね。また折を見て復習したいです。