[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]