テスト - lanchester/rails_environment GitHub Wiki
RSpec-rails
https://github.com/rspec/rspec-rails
rails
向けのテスト用フレームワークです。rails
の標準はMiniTest
ですがRSpec
の方がフレームワーク側でやってくれることが多かったり、ドキュメントが多かったりとデファクトスタンダードになっています。(minitest
のテストファイルは/test
以下にあります。)
テスト用のため開発環境でのみ使用します。
group :development, :test do
gem 'rspec-rails', '~> 3.1.0' # rails 4.0以上
gem 'factory_girl_rails', '~> 4.5.0'
end
factory_girl_rails
はテスト用のモデルオブジェクトを生成するrails
向けのgem
です。javascript
のテストをする場合はcapybara
等も使います。
rails generate rspec:install
以下のファイルが生成されます。
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb
rails
のgenerate
コマンドでテストファイルを作成します
rails generate rspec:model user
これによりUser
モデルのテストファイルが作成されます。
以下がRSpec
の基本的な書式です。
describe 'テスト対象' do
context '状態' do
describe 'テスト対象メソッド' do
context '与える入力' do
it '期待する出力'
end
end
end
end
context
はdescribe
のエイリアスですが目的によって使い分けられます。describe
はテストする対象、context
はテストする時の状況をそれぞれあらわします。どちらも必ず入れないといけないというわけではありません。
FactoryGirl
https://github.com/thoughtbot/factory_girl
FactoryGirl
はテスト用のオブジェクトのひな形を定義しておくことができるgem
です。rails
のデフォルトではfixture
という機能がありますが記述が煩雑になりやすいためFactoryGirl
を使います。
gem 'factory_girl_rails' # railsを使っている場合
# /spec/factories/user_spec.rb
FactoryGirl.define do
factory :user do
sequence(:user_name) {|n| "user_#{n}" }
sequence(:email) {|n| "user_#{n}@example.com" }
password "password"
age "20"
end
end
sequence
はユニーク制約のあるカラム等に使用します。連続でテスト用オブジェクトを作成する際に自動で連番が付与されます。
modelのテスト
以下のコマンドでテストを実行します。
bundle exec rspec
マッチャについて検索するとたまに出てくるhave
やerrors_on
はRSpec 3.0
以降では使えません。
expect(hoge).to have(1).errors_on(:fuga) # RSpec 2.99まで
代わりに下のように書くことができます。
expect(hoge.errors[:fuga].size).to eq(1)
どうしても使いたい場合は別にgem
として切り出されたRSpec::CollectionMatchers
を入れてモンキーパッチを当てることで使えるようになります。
つづく