RailsチュートリアルのRSpecテストについて勉強しました。
まずHomeページのテストから確認してみます。
visit root_pathが複数箇所で宣言されていることがわかります。これは以下の処理を宣言することで改善できます。
before { visit root_path }
これにより、それぞれの例の前にルートパスへのアクセスを実行します (beforeメソッドは、別名でもあるbefore(:each)で呼ぶこともできます)。
変更結果です。変更した後に『$ bundle exec rspec』でテストを動かしてみても正常に実行されることを確認できます。
続いての改善ポイントです。以下の2つの処理ですがどちらも同じ意味を持ちます。
it "should have the content 'Sample App'" do
expect(page).to have_content('Sample App')
さらに、どちらの例もpage変数を参照しています。以下のように、pageはテストの主題 (subject) であることをRSpecに伝えることにより、冗長の原因を排除できます。
subject { page }
subject { page }と記述したことにより、shouldの呼び出しは自動的に、Capybaraにより提供されるpage変数を使用します。
上記について対応した変更結果です。
明らかにスッキリしました。もちろんテストもパスしています。
これで改善完了かなと思ったのですが、最後にもう一つありました。タイトルで使用されている『Ruby on Rails Tutorial Sample App | 』という部分です。
RSpecユーティリティ用ファイルを作成することで変数化することが可能になっていました。
spec/support/utilities.rb
spec/supportディレクトリはRSpecによって自動的に読み込まれます。Homeテストは以下のように書くことができます。
長々と書いていたタイトルがfull_titleメソッドを呼び出すだけで良くなりました。
追記
Homeページのタイトルを指定できる次の処理があります。
<% provide(:title, 'Home') %>
チュートリアルの内容ではこの処理は除外するのですが、勘違いで除外せずに進めていました。ということでここで修正しておきます。
まず、Home.html.erbを修正
次にテスト部分を修正
最後にテストが正常に実行されることを確認して修正完了です。
これでチュートリアルと同じ状態になったはず・・・。