RSpec「共有例」による重複除外

2170 ワード


同じページに複数の用例が重複する可能性があります.以下に、タイトルをテストするとき、home、about、helpページには同じ用例があります.
require 'spec_helper'

describe "StaticPages" do
  subject { page }
  describe "Home page" do
    before { visit root_path }
    it { should have_content('Sample App') }
    it { should have_selector('h1',:text => "Sample App") }
    it { should have_selector('title',:text => full_title(""))}
  end 

  describe "Help page" do 
    before { visit help_path }
    it { should have_content('help') }
    it { should have_selector('h1', :text => "Help") }
    it { should have_selector('title', :text => full_title("Help")) }
  end

  describe "About page" do 
    before { visit about_path }
    it { should have_content('About Us')}
    it { should have_selector("h1", :text => "About")}
    it { should have_selector("title", :text => full_title("About"))}
   end 
  end

 
Rspecは、この重複を解消するための共有例を提供しています.shared_example_for共通のテスト例を抽出する
heading, page_titleは使用例ごとに異なる場所であり,再付与するだけでよい.
letを使用してheading,page_titleが付与された後
it_を使うshould_behave_like「all static pages」を呼び出し、パラメータ共有インスタンス定義時の「all static pages」に注意します.
そうでない場合、Rspecは共有例が見つからないとエラーを報告します.
require 'spec_helper'

describe "Static pages" do
  subject { page }
  shared_examples_for "all static pages" do
    it { should have_selector('h1',    text: heading) }
    it { should have_selector('title', text: full_title(page_title)) }
  end
  describe "Home page" do
    before { visit root_path }
    let(:heading)    { 'Sample App' }
    let(:page_title) { '' }
    it_should_behave_like "all static pages"
    it { should_not have_selector 'title', text: '| Home' }
  end
end