101
78

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.

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

Last updated at Posted at 2016-12-31

初めまして!こんにちは!こんばんは!
もうすぐ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

101
78
2

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
101
78

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?