ちょっと話題の記事

[Ruby on Rails]FactoryGirlによるテストデータの準備

2014.05.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

RSpecを使ってテストを記述している際、テストの実行前にデータをテーブルに登録しておきたいケースが多々あるかと思います。RSpec内でActiveRecordを使ってデータを登録することもできますが、複数のテストケースで同じデータを使いたい場合、データの定義は一箇所で行いたいところです。

この様な場合、Factory Girlを使用すると、一箇所でテストデータを定義できます。今回はこのFactoryGirlの使い方について書きたいと思います。

使い方

使い方の大まかな流れとしては、

  • FactoryGirlが使用できるようにする
  • 定義ファイルにデータを定義する
  • 必要とするテストケースにてファイルを読み込み、データを適時加工して登録する


という感じとなります。尚、この定義したデータを「Factory」とも言います。以下、手順です。

1.Gemfile

Gemfileに以下を記述し、bundle installします。test時にしか使わない場合(ほとんどこのケースと思われる)、「group :test」の中に記述したほうがいいと思います。

group :test do
  gem 'factory_girl_rails'
end

2.spec_helper

spec_helper.rbに以下を記述し、Factoryに定義したデータを、テスト実行時に毎回読み込むようにします。

  config.before(:all) do
    FactoryGirl.reload
  end

3.Factoryの定義

Factoryは、/spec/factoriesフォルダ内に作成します。このフォルダは自動では作成されないため、最初は手動で作成してください。factoriesフォルダ内に、.rbファイルを作成し、Factoryを定義します。例えば、以下のような感じです。

spec/factories/articles.rb

FactoryGirl.define do
  factory :article do
    title "title"
    content "This is a Sample Article."
    image_file_name "article.img"
  end
end

2行目の「:article」が今回定義したFactory名です。3〜5行目に、データベースに登録したい値を定義します。今回はFactory名とRailsのModel名が一致していますが、一つのModelに複数のFactoryを定義する場合などは以下のように記述します。

  factory :article_sample, class: Article do

4.RSpecからの呼び出し

テストデータを必要とする箇所より、FactoryGirl.create()メソッドを使用して、上記で定義したFactoryをデータベースに登録します。

    @article1 = FactoryGirl.create(:article, { title: 'title1', image_file_name: 'IMG_0192.JPG'})
    @article2 = FactoryGirl.create(:article, { title: 'title2', image_file_name: 'IMG_0194.JPG'})

「:article」で定義したFactoryを指定し、続くハッシュ内で登録値を定義し直しています。このようにすると、Factoryではデフォルト値を定義しておき、各テストケース内では固有の値のみを記述して登録する、ということが可能です。勿論、ハッシュにて値を記述しなければ、Factoryに定義した値が全て登録されます。

まとめ

FactoryGirlを使うことで、記述の重複がなく、分かりやすい形でテストデータを定義できることが分かるかと思います。