RailsのRSpecで何気に利用しているFactoryBotについて理解を深めるためにも、今回内容をまとめておきたいと思います。

FactoryBotとは

RSpecではテストを実行する前に対象のデータをDBなどに用意する必要があります。

FactoryBotはRSpecで利用できるgemで、テストに必要なデータを簡単に用意することができるようになります。

Railsには、フィクスチャというFactoryBotに似た機能が標準で搭載されてますが、FactoryBotが便利なので今回はこちらを利用していきます。

ちなみに、以前はFactoryGirlという名前で利用されていました。

導入

Gemfileに「factory_bot_rails」というgemを追加します。

group :development, :test do
  ~

  # 追加
  gem 'factory_bot_rails'
end

RSpecでしか利用しないので、testグループ内に記述しましょう。

あとは、bundlerを利用してインストールを行います。

利用方法

テンプレート作成

データの基となるテンプレートファイルを用意します。

specディレクトリにfactoriesディレクトリを作成し、そこにテンプレートを格納します。

今回はユーザーに関するデータ(Userモデルが用意されていることを前提)をテストしたいと考えてるので、user.rbというファイルを作成します。

# spec/factories/user.rb
FactoryBot.define do
  # 「:user」と指定することで自動的にUserモデルだと推測してくれます。
  factory :user do
    name { '名前' }
    email { 'test@example.com' }
  end
end

この場合「:user」がファクトリ名となるので、データを生成する場合はこのシンボルを利用します。

テンプレートからデータを生成

テンプレートが用意できたら、そのファイルを参照してデータを生成することができるようになります。

以下のようなコードでデータを生成・取得できます。

# UserデータをDBに登録
user = FactoryBot.create :user

# モデルのみ生成
user = FactoryBot.build :user

第一引数には、先ほど用意したテンプレートのファクトリ名を指定します。

以下のように、キーワード引数に属性名を指定することで属性の値を変更することもできます。

FactoryBot.create :user, name: 'テストユーザー'

その他メソッド

attributes_for

ファクトリデータをハッシュとして返します。

例えば、POSTメソッドのリクエスト時にパラメータを送りたい場合、以下のような感じで簡単にパラメータとして利用することができます。

# テンプレートを基にハッシュを生成
user_params = FactoryBot.attributes_for :user

# リクエストパラメータを送信
post user_registration_path, params: { post: user_params }

投稿者: TWEI

趣味はプログラミング。 以前は仕事でプログラミングをやっていました。現在はWebエンジニアを目指して勉強中。 勉強で得た知識などをブログで発信していく予定です。

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA