心はいつもAirPucci (空元気でもいいから)

毎日がPucciを着ているような気分

RailsTutorial4.0を高速で復習する。5.6章。演習1問目。

   


5.6演習です。
一問目。

リスト5.28の静的ページのテストコードは簡潔ですが、まだ繰り返しが残っています。RSpecには、冗長性を排除するためのShared Examplesと呼ばれる機能があります。リスト5.36の例に従い、Help、AboutとContactページで不足しているテストを補ってください。リスト3.31で簡単に紹介したletコマンドは、要求 (変数が使用されるときなど) に応じて与えられた値を持つ「ローカル変数」を作成することにご注意ください。対照的にインスタンス変数は、要素代入 (assignment) されたときに作成されます。

いまの静的ページのテストコードを眺める

require 'spec_helper'

describe "静的ページのテスト" do

  subject { page } 
  let(:base_title) { "Ruby on Rails Tutorial Sample App" }

  describe "Homeページのテスト" do
    before { visit root_path }
    #コンテンツに'Twili'という文字がある" 
    it {should have_content('Twili')}
    #"トップページのタイトル(サブタイトルがない)" 
    it {should have_title("#{base_title} ")}
    #"カスタマイズしたページのタイトル(タイトルにHomeがない)"
    it {should_not have_title('| Home')}
  end

  describe "Helpページのテスト" do
    before { visit help_path }
    #"コンテンツに'Help'という文字がある"
    it {should have_content('Help')}
    #"サブタイトルに'Help'という文字がある" 
    it {should have_title("#{base_title} | Help")}
  end

  describe "Aboutページのテスト" do
    before { visit about_path }
    #コンテンツに'About Us'という文字がある" 
    it {should have_content('About Us')}
    #"サブタイトルに'About Us'という文字がある"
    it {should have_title("#{base_title} | About Us")}
  end

  describe "Contactページのテスト" do
    before { visit contact_path }
    #コンテンツに'Contact'という文字がある"
    it {should have_content('Contact')}
    #"タイトルに'Contact'という文字がある"
    it {should have_title("#{base_title} | Contact")}
  end
end

確かに、重複はある。同じことやってるんだなと。

RSpecの冗長性を排除するためのShared Examples

んーむ。サブページの処理が同じなのでサブページ名だけletで指定してShared Examples使えばいいのかな?と思っていたら
リスト5.36 RSpecのShared Exampleを使用してテストの冗長性を排除する。
に、だいたい答えが書いてありました。ちょっっとアプローチ違った。これにならって書いてみます。

require 'spec_helper'

describe "静的ページのテスト" do

  subject { page } 
  let(:base_title) { "Ruby on Rails Tutorial Sample App" }

  shared_examples_for "静的ページ共通テスト" do
    it { should have_content(heading) }
    it { should have_title("#{base_title} #{sub_title} ") }
  end

  describe "Homeページのテスト" do
    before { visit root_path }
    let(:heading) { 'Twili' }
    let(:sub_title) { "" }

    #コンテンツに'Twili'という文字がある
    #トップページのタイトル(サブタイトルがない)
    it_should_behave_like "静的ページ共通テスト"
    #カスタマイズしたページのタイトル(タイトルにHomeがない)
    it { should_not have_title('| Home') }
  end

  describe "Helpページのテスト" do
    before { visit help_path }
    let(:heading) { 'Help' }
    let(:sub_title) { '| Help' }

    #コンテンツに'Help'という文字がある
    #サブタイトルに'Help'という文字がある 
    it_should_behave_like "静的ページ共通テスト"
  end

  describe "Aboutページのテスト" do
    before { visit about_path }
    let(:heading) { 'About' }
    let(:sub_title) { '| About' }

    #コンテンツに'About Us'という文字がある
    #サブタイトルに'About Us'という文字がある
    it_should_behave_like "静的ページ共通テスト"
  end

  describe "Contactページのテスト" do
    before { visit contact_path }
    let(:heading) { 'Contact' }
    let(:sub_title) { '| Contact' }

    #コンテンツに'Contact'という文字がある
    #タイトルに'Contact'という文字がある
    it_should_behave_like "静的ページ共通テスト"
  end
end

shared_examples_for の次を””でくるんで日本語で書いてみました。これはit_should_behave_likeの引数、というか置き換えになるんだと思いますが、動きました。いいのかな。

2行の処理を共通化するために、2行letでローカル変数していて、あまり意味なくないか?
で、結局以下のようにしました。

require 'spec_helper'

describe "静的ページのテスト" do

  subject { page } 
  let(:base_title) { 'Ruby on Rails Tutorial Sample App' }
  let(:title_delimiter) { '| ' }

  shared_examples_for "静的ページ共通テスト" do
    it { should have_content(heading) }
    it { should have_title("#{base_title} #{title_delimiter} #{heading} ") }
  end

  describe "Homeページのテスト" do
    before { visit root_path }
    #コンテンツに'Twili'という文字がある" 
    it {should have_content('Twili')}
    #"トップページのタイトル(サブタイトルがない)" 
    it {should have_title("#{base_title} ")}
    #"カスタマイズしたページのタイトル(タイトルにHomeがない)"
    it {should_not have_title('#{title_delimiter} Home')}
  end

  describe "Helpページのテスト" do
    before { visit help_path }
    let(:heading) { 'Help' }

    #コンテンツに'Help'という文字がある
    #サブタイトルに'Help'という文字がある 
    it_should_behave_like "静的ページ共通テスト"
  end

  describe "Aboutページのテスト" do
    before { visit about_path }
    let(:heading) { 'About' }

    #コンテンツに'About Us'という文字がある
    #サブタイトルに'About Us'という文字がある
    it_should_behave_like "静的ページ共通テスト"
  end

  describe "Contactページのテスト" do
    before { visit contact_path }
    let(:heading) { 'Contact' }

    #コンテンツに'Contact'という文字がある
    #タイトルに'Contact'という文字がある
    it_should_behave_like "静的ページ共通テスト"
  end
end

トップページのHome以外は同じ構成、ってわかるテスト。最初に思いつたのを結局採用しました。

次は2問目です。

 - テクニカル ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

パーフェクトRuby 2章Rubyの基礎 2-6 モジュール

p57 2-6 モジュール 2-6-1モジュールの定義式 モジュールはインスタン …

no image
railsのエラーメッセージを日本語化

message:で渡すエラーメッセージや、その他いろんな箇所を日本語化します。 …

no image
RailsTutorial4.0を高速で復習する。3.3.3章。

3.3.3埋め込みRubyです。viewにrubyコードを埋め込んでtitleを …

カスペルスキーを使っています

PCのウィルススキャンは、多くの人が使っているかと思います。 大手3社のソフトを …

no image
RailsTutorial4.0を高速で復習する。4章と4.1章。

さて、4章です。4章ではRubyに関する内容が多かったような記憶が。 動的なWe …

no image
RailsTutorial4.0を高速で復習する。5.6章。演習2問目。

5.6演習、2問目です。これをやったら、すっ飛ばしているリンク貼り作業をします。 …

パーフェクトRuby 2章Rubyの基礎 2-5-5 クラスメソッド

p54 2-5-5 クラスメソッド インスタンスメソッドに対して、クラスに対して …

no image
IBActionのIBって?

railsもやってますが、xcodeも再開しています。 ところで、 IBActi …

no image
RailsTutorial4.0を高速で復習する。10.3.3章。

10.3.4マイクロポストを削除する、です。 仕様 マイクロポスト個別に削除でき …

Lionさんがお出まし?AppStoreでのアップデート

MacBookAirのDockにあるAppStoreアイコンになにやらアップデー …