3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rspec,Rails】full_title helperの単体テスト

Last updated at Posted at 2022-02-25

テストの対象となる機能

application helperに次のようなfull_title helperを定義している。

appplication_helper.rb
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へテストを記述する方法もある。

system_spec
expect(page).to have_title "#{content.name} - HOGE"
#content.nameという内容をタイトルに表示したい場合を想定している。

ただし、この方法だと、ページが増えるたびにこれをsystem_specに記述することになるし、このhelperの本質である「動的な表示をテスト」している記述であるかと言われれば、そうとも言えない。

そこで、このhelperの単体のテストを別途設け、そこに条件分岐を与えた上で、条件に応じた動的な表示の機能があるかをテストしていきたい。

具体的には、spec/helpers/application_helper_spec.rbを作成し、次のようなテストを書く。

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というファイルで実行される内容は、あくまでも機能をテストすることに終始すべきである。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?