tyoshikawa1106のブログ

- Force.com Developer Blog -

Rails:Rspecによるテストの改善

RailsチュートリアルのRSpecテストについて勉強しました。


まずHomeページのテストから確認してみます。
f:id:tyoshikawa1106:20150721213839p:plain


visit root_pathが複数箇所で宣言されていることがわかります。これは以下の処理を宣言することで改善できます。

before { visit root_path }

これにより、それぞれの例の前にルートパスへのアクセスを実行します (beforeメソッドは、別名でもあるbefore(:each)で呼ぶこともできます)。


変更結果です。変更した後に『$ bundle exec rspec』でテストを動かしてみても正常に実行されることを確認できます。
f:id:tyoshikawa1106:20150721214113p:plain


続いての改善ポイントです。以下の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変数を使用します。


上記について対応した変更結果です。
f:id:tyoshikawa1106:20150721215424p:plain


明らかにスッキリしました。もちろんテストもパスしています。
f:id:tyoshikawa1106:20150721215515p:plain


これで改善完了かなと思ったのですが、最後にもう一つありました。タイトルで使用されている『Ruby on Rails Tutorial Sample App | 』という部分です。


RSpecユーティリティ用ファイルを作成することで変数化することが可能になっていました。

spec/support/utilities.rb

f:id:tyoshikawa1106:20150721215940p:plain


spec/supportディレクトリはRSpecによって自動的に読み込まれます。Homeテストは以下のように書くことができます。
f:id:tyoshikawa1106:20150721220415p:plain


長々と書いていたタイトルがfull_titleメソッドを呼び出すだけで良くなりました。

追記

Homeページのタイトルを指定できる次の処理があります。

<% provide(:title, 'Home') %>

チュートリアルの内容ではこの処理は除外するのですが、勘違いで除外せずに進めていました。ということでここで修正しておきます。


まず、Home.html.erbを修正
f:id:tyoshikawa1106:20150721221227p:plain


次にテスト部分を修正
f:id:tyoshikawa1106:20150721221352p:plain


最後にテストが正常に実行されることを確認して修正完了です。
f:id:tyoshikawa1106:20150721221449p:plain


これでチュートリアルと同じ状態になったはず・・・。