RSpec「共有例」による重複除外
同じページに複数の用例が重複する可能性があります.以下に、タイトルをテストするとき、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