Capybara / RSpec / Rails / Ruby

連載: Rails4+RSpec+Capybaraでよく使うマッチャ&メソッド22個+α

「」第回の今回はページ内容をhave_contentマッチャで確認します。

ちなみにここでいうコンテンツはページ内のテキストとなります。

have_contentマッチャでのコンテンツ内容確認を行うには

expect(page).to have_content 'Rails4でCapybara入門'

のようにマッチャを使います。

scenarioブロックで書くと

scenario do
  visit '/'
  expect(page).to have_content 'Rails4でCapybara入門'
end

となります。

前回のhave_titleマッチャも合わせて使うと

scenario do
  visit '/'
  expect(page).to have_title '江の島エンジニアBlog'
  expect(page).to have_content 'Rails4でCapybara入門'
end

となります。

テストを分ける

上記ではscenarioブロックの中でhave_titleマッチャとhave_contentマッチャを使いましたが、これだとhave_titleが失敗した時にhave_contentが成功なのか失敗なのかがわかりません。

そういう場合はテストケースを分けて

scenario do
  visit '/'
  expect(page).to have_title '江の島エンジニアBlog'
end

scenario do
  visit '/'
  expect(page).to have_content 'Rails4でCapybara入門'
end

とすると良いです。

beforeを使う

テストケースを分けた場合、visitを2回実行していてDRYではないのでbeforeブロックを使ってvisitメソッドをまとめます。

before { visit '/' }

scenario do
  expect(page).to have_title '江の島エンジニアBlog'
end

scenario do
  expect(page).to have_content 'Rails4でCapybara入門'
end

これでどちらのscenarioも実行前にbeforeブロック内のvisitメソッドが実行されます。

itを使う

scenarioブロックの中が1行なので、こういう時はitsubjectshouldを使ってすっきり書けます。

before { visit '/' }
subject { page }

it { should have_title '江の島エンジニアBlog' }
it { should have_content 'Rails4でCapybara入門' }

テストを実行する

今回作成したテストを実行すると

view top page
  should have title "江の島エンジニアBlog"
  should have content "Rails4でCapybara入門"

となりちゃんと両方ともテストに成功しました。

次回はhave_linkマッチャを使ったリンクの確認を行います。

関連記事