[Ruby on Rails 3, Ruby on Rails 4] RSpec/Capybara/FactoryGirl: FactoryGirl を使ったテストを試す
fixture を置き換えるツール。Rubyコードで定義する。
 
 [markdown]
> * [7.1.3ファクトリーを使用してユーザー表示ページをテストする](http://railstutorial-ja.herokuapp.com/chapters/sign-up#sec-tests_with_factories)
 > * [thoughtbot/factory_girl](https://github.com/thoughtbot/factory_girl)
 > * [[rails]has_manyなフィクスチャを書くのに疲れたらFactory Girlがオススメ! – func09](http://www.func09.com/wordpress/archives/532#more-532)
## Gemfile
“`
 group :test do
 gem ‘factory_girl_rails’, ‘4.1.0’
 end
 “`
## ファクトリの定義
Userモデルオブジェクトをシミュレートするためのファクトリーを spec/factories.rb に置きます。
 RSpecによって自動的に読み込まれます。
 spec/factories ディレクトリ配下に定義する方法もあるよう。
> * [letメソッドとFactory Girl – RSpec/Capybara入門 – Ruby on Rails with OIAX](http://www.oiax.jp/rails/rspec_capybara_primer/let_and_factory_girl.html)
 > * [FactoryGirlをRuby on Railsで使うときの覚書 – 発声練習](http://d.hatena.ne.jp/next49/20130524/p1)
“`
 % rails g factory_girl:model モデル名単数 属性名1:型 属性名2:型 … 属性名n:型
 “`
spec/factories/モデル名複数.rb に雛形がつくられる。
### spec/factories.rb
“`
 FactoryGirl.define do
 factory :user do
 name     “Michael Hartl”
 email    “michael@example.com”
 password “foobar”
 password_confirmation “foobar”
 end
 end
 “`
## テストコード
RSpec の letコマンドとFactoryGirlメソッドを使用してUserのファクトリーを作成することができます。
> [letでは値がメモ化 (memoize) されるという特長があり、ある呼び出しから次の呼び出しに渡って値を利用できます。](http://railstutorial-ja.herokuapp.com/chapters/modeling-users#sidebar-let)
 spec/requests/user_pages_spec.rb
“`
 require ‘spec_helper’
 describe “UserPages” do
 subject { page }
 describe “profile page” do
 let(:user) { FactoryGirl.create(:user) }
 before { visit user_path(user) }
 it { should have_selector(‘h1’,    text: user.name) }
 it { should have_selector(‘title’, text: user.name) }
 end
 end
 “`
## テストの高速化
BCryptのコストファクターをテスト環境向けに再定義することで、テストを高速化できる。
### config/environments/test.rb
“`
 # Speed up tests by lowering BCrypt’s cost function.
 require ‘bcrypt’
 silence_warnings do
 BCrypt::Engine::DEFAULT_COST = BCrypt::Engine::MIN_COST
 end
 “`
### テスト
定義前
“`
 % time bundle exec rspec spec/
 ……………………………
 Finished in 3.84 seconds
 33 examples, 0 failures
 Randomized with seed 28268
 bundle exec rspec spec/  1.05s user 0.16s system 22% cpu 5.358 total
 “`
定義後
“`
 % time bundle exec rspec spec/
 ……………………………
 Finished in 0.92622 seconds
 33 examples, 0 failures
 Randomized with seed 43406
 bundle exec rspec spec/  1.04s user 0.16s system 50% cpu 2.397 total
 “`
確かに速くなったようです。
## 補遺
> * [RailsのFactoryGirlのsequenceが便利 / チュパカブラの勉強日記](http://yoshifumisato.jeez.jp/wordpress/post/rails/1088)
 > * [Ruby – Factory Girl 3.x メモ – Qiita [キータ]](http://qiita.com/torshinor/items/383691344ec4a2233fe5)
 > * [RailsでFactoryGirlを使ってみるメモ [俺の備忘録]](http://o.inchiki.jp/obbr/159)
 > * [これからテストを書き始めたい人のための Rails+RSpec+Spork+FactoryGirl チュートリアル(その1) – Qiita [キータ]](http://qiita.com/emsk/items/bf1bc376d88186050f3f)
 > * [これからテストを書き始めたい人のための Rails+RSpec+Spork+FactoryGirl チュートリアル(その2) – Qiita [キータ]](http://qiita.com/emsk/items/fbe0a4ac2269a743dc17)
 [/markdown]
