心はいつも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

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

  関連記事

no image
電源が入らない!MacBookAirが真っ黒になりました。

iPhoneを買ったばかりの頃、iPhoneのメーラーを立ち上げても中身が表示さ …

no image
Ruby on Railsのインストール

Rubyのアップデートが終わったので、いよいよRailsをインストールします。 …

RailsTutorial4.0を高速で復習する。11.1.4章。

11.1.4フォローしているユーザー 、です。 followed_usersとf …

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

6.2.5一意性を検証する、です。メールアドレスをIDとして使うため(でなくとも …

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

3.3.4レイアウトを使って重複を解消する、です。 ここでapplication …

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

6.3.3ユーザー認証、です。 新規ユーザー登録のときは入力で、:passwor …

ジョジョ専用kindle fire HDの電源が入らない!

電源が入らない!MacBookAirが真っ黒になりました。とか、 iPhoneの …

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

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

Ruby1.9+Rails3.2に加えて、Ruby2.0+Rails4.0のプロジェクトを作る。

Ruby1.9+Rails3.2のプロジェクトは作りましたが、その後、Ruby2 …

詳解 Objective-C 2.0 第3版 CHAPTER2 Objective-Cのプログラム

Objective-Cの解説はメッセージから始まる。このメッセージという概念、も …