22
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Rails】factory_botの使い方について

Posted at

はじめに

Railsにはfactory_botという便利なgemがあり、そのgemについてまとめました。
factory_botというgemを一言で言うとRspecで用いるテストデータの作成を楽にしてくれるgemです。
Rspecを入れていない方は下記の記事を参考にして入れると良いと思います。

@Mosacさんの記事
RSpecをRailsにインストールする

factory_botを使用する場合は下記のような形でGemfileに記述します。

Gemfile
gem "factory_bot_rails"

使用方法

導入方法

spec/配下にsupportフォルダを作成し、support配下にfactory_bot.rbを作成し、以下を記述する。

factory_bot.rb
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

spec/rails_helper.rbにコメントアウトしてある下記のコメントアウトを外し、
support配下のファイルを読み込むように設定する。

rails_helper.rb
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

テストデータの作成方法

spec/factories/配下にテストしたい該当モデルのファイルを作成する。
Userモデルならusers.rbという形でファイルを作成する。
カラムに仮の値を定義して作成する。

spec/factories/users.rb
FactoryBot.define do
  factory :user do
    name { "hoge" }
    email { "foo@bar.com" }
  end
end

上記の場合、userとしてnameがhoge,emailがfoo@bar.comのデータが仮作成される。

モデル名以外の名前をつける場合は下記のように記述する。

spec/factories/users.rb
FactoryBot.define do
  factory :adminuser, class: User do
    name { "hoge" }
    email { "foo@bar.com" }
  end
end

Rspecでのテストデータ使用方法

定義の仕方は下記の通り。

spec/models/users_spec.rb
RSpec.describe User, type: :model do
  let(:user){ FactoryBot.create(:user) } #通常の書き方 DB登録される
  let(:user){ create :user} #省略記法

  let(:user){ FactoryBot.build (:user)} #通常の書き方 DB登録されない
  let(:user){ build :user} #省略記法

  let(:user){ build :user, name: "hogehoge"} #上書きすることも可能
end

上記のようにデータを定義することによって、モデルやコントローラー上で
仮のデータを使ったテストをすることが可能になる。

参考記事

【Rails】factory_botの使い方メモ
RailsアプリへのRspecとFactory_botの導入手順

22
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?