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

----

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

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

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

と、いうことで
今回は私が大好きな『Factory Girl』について書こうと思います。
## FactoryGirlって誰？
FactoryGirlとは、テストデータの作成を手伝ってくれるgemです。
テストデータ...
それはテストコードを書く上で切っても切り離せない存在です。
自力でテストデータを用意することも可能ですが、
FactoryGirlを使用すると、複数のテストデータなどを簡単に作成することができます！
## FactoryGirlのインストール
それでは、FactoryGirlをインストールしてみましょう。

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

```Gemfile
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
- [いまさら聞けないfactory_girl入門](http://tech.grooves.com/entry/2015/04/28/173025)
- [Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)