世界一やさしいFactoryGirlの使い方:入門編

  • 13
    Like
  • 0
    Comment

初めまして!こんにちは!こんばんは!
もうすぐ2016年も終わりますね。
新卒エンジニアのよう太と申します。

突然ですが、皆さん
『きれいなおねえさんは、好きですか。』

私は大好きです。
かわいい女の子も好きです。

と、いうことで
今回は私が大好きな『Factory Girl』について書こうと思います。

FactoryGirlって誰?

FactoryGirlとは、テストデータの作成を手伝ってくれるgemです。
テストデータ...
それはテストコードを書く上で切っても切り離せない存在です。
自力でテストデータを用意することも可能ですが、
FactoryGirlを使用すると、複数のテストデータなどを簡単に作成することができます!

FactoryGirlのインストール

それでは、FactoryGirlをインストールしてみましょう。

インストールが無事に完了したら、Gemfileに'factory_girl_rails'を追加してください。
今回私は新規アプリを作成したので、'rspec-rails'も一緒に追加しました。

group :development, :test do
  gem 'rspec-rails',
  gem 'factory_girl_rails'

このままbundle installを行うと、最新バージョンがインストールされるので、
バージョンを指定したい方は

'factory_girl_rails', '~> 4.0'

このように、gemの後ろに指定したいバージョンを書いてください。

FactoryGirlと出会ってみる

ファクトリーファイルの作成

インストールが終わったら、早速ファクトリーをアプリケーションに追加してみましょう。
FactoryGirlをインストールしている状態でモデルを作成すると、
モデルと一緒にファクトリーも作成されます。

$ rails g model Blog title:string word:text writer:string
Running via Spring preloader in process 7449
      invoke  active_record
      create    db/migrate/2016**********_create_blogs.rb
      create    app/models/blog.rb
      invoke    rspec
      create      spec/models/blog_spec.rb
      invoke      factory_girl
      create        spec/factories/blogs.rb

既にアプリケーションをお持ちの方は、
specディレクトリの配下にfactoriesディレクトリを作成し、

モデル名.rb

上記のようなファイル名を作ってください。

デフォルトのテストデータ

ファクトリーファイルの作成ができたら、テストデータを作成してみましょう。

先ほど rails gコマンドでBlogモデルを作成したので、
spec/factories/blogs.rbで定義しようと思います。
モデルと一緒に作成されたspec/factories/blogs.rbを見てみると、
下記のようなテストデータが自動的に作成されています。

FactoryGirl.define do
  factory :blog do
    title "MyString"
    word "MyText"
    writer "MyString"
  end
end

せっかくテストデータを用意してくれたので、
テストを実行するとどのようなデータができるのか試してみます。

spec/models/blogs.rb
#適当を極めたテストコードなので、良い子プログラマーは真似しないでくださいね!
require 'rails_helper'
RSpec.describe Blog, :type => :model do

  describe "#hogehoge" do
    context "BlogのFactoryを作成した場合" do
        it "テストデータが作成される" do 
            blog_model = FactoryGirl.create(:blog)

            p blog_model
        end
    end
  end
end

適当に書いたこのテストを実行すると...

<Blog id: 1, title: "MyString", word: "MyText", writer: "MyString", created_at: "2016-**-** **:**:**", updated_at: "2016-**-** **:**:**">

う、産まれましたーーーー!
元気なデフォルトテストデータが産まれましたよーーーーーー!

FactoryGirlと遊んでみる

テストデータの生成

デフォルトのテストデータを作成した際に、下記のようなコードを書きました。

spec/models/blogs.rb
blog_model = FactoryGirl.create(:blog)

このように、FactoryGirl.create(:モデル名)と記述した場合
DBにテストデータが保存されます。

試しにtest環境のDBを覗いてみると...

mysql> select * from blogs;                                                                                                                                    
+----+----------+--------+----------+---------------------+---------------------+
| id | title    | word   | writer   | created_at          | updated_at          |
+----+----------+--------+----------+---------------------+---------------------+
|  1 | MyString | MyText | MyString | 2016-**-** **:**:** | 2016-**-** **:**:** |
+----+----------+--------+----------+---------------------+---------------------+

Blogテーブルにテストデータが保存されていることが確認できました!
createの他にも、buildやattributesといったテストデータの生成方法があります。

FactoryGirl.build(:モデル名)
FactoryGirl.create(:モデル名)
FactoryGirl.attributes_for(:モデル名)

テストデータの上書き

テストコードを書いていくと、デフォルトのテストコードではなく
より現実的なデータを使用したくなるかもしれません。
そんな時は、テストデータを生成する際に、引数として「任意のテストデータ」を追加してみましょう。
Blogモデルには[writer]というブログの著者の名前を格納するカラムがあるので、
著者の名前を指定してみます。

spec/models/blogs.rb
blog_model = FactoryGirl.create(:blog, writer:'asopasomaso')

このテストコードを実行すると...

<Blog id: 2, title: "MyString", word: "MyText", writer: "asopasomaso", created_at: "2016-**-** **:**:**", updated_at: "2016-**-** **:**:**">

著者の名前が"asopasomaso"なテストデータが生成されます。

複数のテストデータ作成

ここまで取り上げてきたテストデータの生成方法では、
一度に1つのテストデータしか作成することができません。
複数のテストデータを生成したい場合は、create_listの引数に「生成したいテストデータの数」を追加してください。
例として、5つのBlogを作成してみます。

spec/models/blogs.rb
blog_model = FactoryGirl.create_list(:blog, 5)

このテストコードを実行すると...

<Blog id: 3, title: "MyString", word: "MyText", writer: "MyText", created_at: "2016-**-** **:**:**", updated_at: "2016-**-** **:**:**">
<Blog id: 4, title: "MyString", word: "MyText", writer: "MyText", created_at: "2016-**-** **:**:**", updated_at: "2016-**-** **:**:**">
<Blog id: 5, title: "MyString", word: "MyText", writer: "MyText", created_at: "2016-**-** **:**:**", updated_at: "2016-**-** **:**:**">
<Blog id: 6, title: "MyString", word: "MyText", writer: "MyText", created_at: "2016-**-** **:**:**", updated_at: "2016-**-** **:**:**">
<Blog id: 7, title: "MyString", word: "MyText", writer: "MyText",......

モデル名の後ろに追加した「生成したいテストデータの数」分、テストデータが生成されます。

FactoryGirlと付き合ってみる?

FactoryGirlの便利な機能はこれだけではありません。
連番データの作成や、関連データの作成などなど、
様々なテストデータを作成することができます。

(´-`).。oO(年明けにまとめようかな...)

References