テスト - 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

railsgenerateコマンドでテストファイルを作成します

rails generate rspec:model user

これによりUserモデルのテストファイルが作成されます。

以下がRSpecの基本的な書式です。

describe 'テスト対象' do
  context '状態' do
    describe 'テスト対象メソッド' do
      context '与える入力' do
        it '期待する出力'
      end
    end
  end
end

contextdescribeのエイリアスですが目的によって使い分けられます。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

マッチャについて検索するとたまに出てくるhaveerrors_onRSpec 3.0以降では使えません。

expect(hoge).to have(1).errors_on(:fuga) # RSpec 2.99まで

代わりに下のように書くことができます。

expect(hoge.errors[:fuga].size).to eq(1)

どうしても使いたい場合は別にgemとして切り出されたRSpec::CollectionMatchersを入れてモンキーパッチを当てることで使えるようになります。

つづく