テストの対象となる機能
application helperに次のようなfull_title helperを定義している。
module ApplicationHelper
BASE_TITLE = "HOGE".freeze
def full_title(page_title)
page_title.blank? ? BASE_TITLE : "#{page_title} - #{BASE_TITLE}"
end
end
ページタイトルを取得して、ベースタイトルとともにtitleタグに動的な表示を行うために作られた、普通のタイトルヘルパーである。
Rspecによって、この機能のテストを記述したい。
helperの単体テスト
この機能のテストを記述するにあたっては、次のように、他の要素のテストとともに、system specへテストを記述する方法もある。
expect(page).to have_title "#{content.name} - HOGE"
#content.nameという内容をタイトルに表示したい場合を想定している。
ただし、この方法だと、ページが増えるたびにこれをsystem_specに記述することになるし、このhelperの本質である「動的な表示をテスト」している記述であるかと言われれば、そうとも言えない。
そこで、このhelperの単体のテストを別途設け、そこに条件分岐を与えた上で、条件に応じた動的な表示の機能があるかをテストしていきたい。
具体的には、spec/helpers/application_helper_spec.rbを作成し、次のようなテストを書く。
require 'rails_helper'
RSpec.describe ApplicationHelper, type: :helper do
describe "#full_title" do
it "引数が渡されている場合に動的な表示がなされること" do
expect(full_title('sample')).to eq('sample - HOGE')
end
it "引数が空白の場合に動的な表示がなされること" do
expect(full_title('')).to eq('HOGE')
end
it "引数がnilの場合に動的な表示がなされること" do
expect(full_title(nil)).to eq('HOGE')
end
end
end
注意点はfull_title helperを「タイトルを表示するためのもの」として扱わないこと、
つまり、viewに特有の概念や「タイトル」という言葉を、application_helper_spec内で使うべきでないということである。
full_titleという名前ではあるが、このヘルパーは本来、viewや特定のタイトルに依存しない、汎用的な機能である。
単に、与えられた引数を取得し、元々ある定数と一緒に返すという機能に過ぎない。
たとえ、与えられた引数がviewやタイトルに関係のない内容であっても、この機能自体は担保されていないといけない。
「機能」をテストするために作られた、application_helper_specというファイルで実行される内容は、あくまでも機能をテストすることに終始すべきである。