【改訂版】Rails4＋RSpec＋Capybaraでよく使うマッチャ＆メソッド22個+α

前に作った[連載記事へのリンク](http://qiita.com/haracane/items/3dde249f967102325f32)だけだと結局辿らなくちゃいけなくて面倒なので、利用例をまとめてみました。

※ 元記事：[Rails4＋RSpec＋Capybaraでよく使うマッチャ＆メソッド22個+α｜江の島CodeStyle](http://blog.enogineer.com/2014/10/30/rails-capybara-index/)

例えば①ログインする、②表示内容を確認する、③フォーム入力する、という流れをCapybaraでテストするとこんな感じになります。

```ruby
require 'rails_helper'

feature 'post an article', type: :feature do
  before do
    ## Create data
  end

  feature 'sign in' do
    include Warden::Test::Helpers

    before(:all) { Warden.test_mode! }
    after(:all)  { Warden.test_reset! }
    let(:user) { create :user }
    before { login_as user }

    feature 'edit an article' do
      before { visit '/' }
      subject { page }

      it { should have_title 'title' }
      it { should have_content 'content' }
      it { should have_link('top', href: '/') }
      it { should have_css('h1', text: 'title') }
      it { should have_css(".user[data-url='http://twitter.com/jack/']") }

      it { should have_button('search') }
      it { should have_field('title', with: 'title') }
      it { should have_checked_field('language', with: 'japanese') }
      it { should have_unchecked_field('language', with: 'english') }
      it { should have_select('select', selected: 'option') }
      it { should have_select('no_select', selected: []) }

      feature 'fill in form' do
        scenario do
          fill_in 'title_id', with: 'title'
          select  'option_name', from: 'select_id'
          choose 'radio_button_label'
          check 'checkbox_id'
          uncheck 'checkbox_id'
          click_on 'submit'
          ...
        end
      end
    end
  end
end
```

他にも便利なメソッドが色々用意されています。

```ruby
before { first('submit').click }
its(:current_url) { should eq 'http://example.com/' }
its(:current_host) { should eq 'example.com' }
its(:current_path) { should eq '/' }
it { expect(find_button('検索').native['class']).to match /btn/ }
it { expect(find_field('title').native['class']).to match /title/ }
it { expect(find_field('title').text).to be_empry) }
it { expect(find_by_id('content').native.children).to have(5).items }
it { expect(find_link('top').native['class']).to match /link/ }
it { expect(all('li')).to have(5).items }
```

それぞれメソッドやマッチャの使い方については以下の記事をご覧ください。

* [第1回：have_titleマッチャでタイトル内容を確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-title)
* [第2回：have_contentマッチャでコンテンツ内容を確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-content)
* [第3回：have_linkマッチャでリンク内容を確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-link)
* [第4回：have_cssマッチャで指定したタグの内容を確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-css)
* [第5回：have_buttonマッチャで指定したボタンを確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-button)
* [第6回：have_fieldマッチャで指定した入力フィールドを確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-field)
* [第7回：have_checked_fieldマッチャで指定したチェックボックス/ラジオボタンを確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-checked-field)
* [第8回：have_unchecked_fieldマッチャで指定したチェックボックス/ラジオボタンを確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-unchecked-field)
* [第9回：have_selectマッチャで指定したセレクトボックスの選択内容を確認する](http://blog.enogineer.com/2014/10/11/rails-capybara-have-select)
* [第10回：click_onメソッドでボタンをクリックする](http://blog.enogineer.com/2014/10/11/rails-capybara-click-on)
* [第11回：fill_inメソッドでフォームにテキストを入力する](http://blog.enogineer.com/2014/10/11/rails-capybara-fill-in)
* [第12回：selectメソッドでセレクトボックスから要素を選択する](http://blog.enogineer.com/2014/10/11/rails-capybara-select)
* [第13回：chooseメソッドでラジオボタンから要素を選択する](http://blog.enogineer.com/2014/10/11/rails-capybara-choose)
* [第14回：checkメソッドでチェックボックスを選択する](http://blog.enogineer.com/2014/10/11/rails-capybara-check)
* [第15回：uncheckメソッドでチェックボックスを選択解除する](http://blog.enogineer.com/2014/10/11/rails-capybara-uncheck)
* [第16回：findメソッドでオブジェクトを取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-find)
* [第17回：find_buttonメソッドでボタン要素を取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-find-button)
* [第18回：find_fieldメソッドでフィールド要素を取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-find-field)
* [第19回：find_by_idメソッドでid要素を取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-find-by-id)
* [第20回：find_linkメソッドでリンク要素を取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-find-link)
* [第21回：allメソッドで要素リストを取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-all)
* [第22回：nativeメソッドでネイティブオブジェクトを取得する](http://blog.enogineer.com/2014/10/11/rails-capybara-native)
* [第23回：find＆nativeメソッドでmeta要素をテストする](http://blog.enogineer.com/2014/10/11/rails-capybara-meta-content)
* [第24回：Basic認証が必要なページをテストする](http://blog.enogineer.com/2014/10/11/rails-capybara-basic-auth)
* [第25回：ログインが必要なページをテストする](http://blog.enogineer.com/2014/10/11/rails-capybara-login)