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

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

  関連記事

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

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

no image
formatはどこから取ってくる?

ruby on rails3プリケーションプログラミングの本の内容をruby2. …

no image
wordpressはじめます

ブログを立ち上げるのは久しぶりです。 以前から、ブログメディアをやりたいと思って …

no image
gamilアカウントが乗っ取られました

朝起きてすぐ行うメール確認。iphoneでgmail接続できないってエラーが出る …

no image
editとupdate

ruby on rails3プリケーションプログラミングの本の内容をruby2. …

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

7.2ユーザー登録フォーム、です。 ユーザー認証も登録も、モデルは作ってあるので …

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

仕様の探求 userモデルには、登録と認証、承認に必要なモデルは既に作ってありま …

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

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

no image
Ruby 1.9系をインストールする

Rubyのバージョン管理ができるrbenvをインストールしたらいよいよRubyの …

no image
恐ろしや、WordPressのDBパスワードは平文でおいてある

先ほどサーバーのDBをいじっていてですね、、久々だったのでDBパスワード忘れてし …