RSpec - 跨路线测试多个期望

RSpec - testing multiple expectations across routes

我正在尝试使用 shared_examples 作为跨多条路线重复期望的方式。特别是,我想测试页眉和页脚中的一些静态资源是否正在加载。但是,我收到一条错误消息:

RSpec::Core::ExampleGroup::WrongScopeError: `it_behaves_like` is not available from within an example (e.g. an `it` block) or from constructs that run in the scope of an example (e.g. `before`, `let`, etc). It is only available on an example group (e.g. a `describe` or `context` block).

现在,我不确定如何解决这个问题。这是我当前的设置。

shared_examples_for 'a page' do 
    describe 'should load static assets' do 
        it 'header, footer and icons' do 
            expect(page).to have_css 'footer.footer'                
            expect(page).to have_css '#navbar-brand'                
            brand = page.first(:css, '#navbar-brand')
            visit brand[:src]                                       
            expect(page.status_code).to be 200 
        end
    end
end


describe 'site pages should load static assets on requests', { :type => :feature } do 

after :all do 
    it_behaves_like 'a page'
end

it 'home page' do
    visit '/'
    expect(page).to have_css 'div#main-menu a', count: 5 
    page.all('link[rel~="icon"]').each do |fav|             
        visit fav[:href]
        page.status_code.should be 200
    end 
    expect(page).to have_css 'div#main-menu'
    ...     
end

it 'about page should have icons, footer and a header' do 
    visit '/about'
    ...
end 

结束

另一个尝试是这样的:

describe 'home page' do 
    it_behaves_like 'a page'
end 

两者都因上述相同原因而失败。那么,如果我想在每个页面上检查相同的内容,什么是更好的解决方案?

RSpec 3 这应该可以工作

require 'spec_helper'

shared_examples 'a page' do 
  it 'has a header' do
    expect(page).to have_css 'footer.footer'
  end

  it 'has a brand' do       
    expect(page).to have_css '#navbar-brand'
  end

  it 'points out to brand page' do
    brand = page.first(:css, '#navbar-brand')
    visit brand[:src]                                      
    expect(page.status_code).to be 200 
  end
end

describe 'home page' do
  before { visit '/' }      

  it_behaves_like 'a page'

  it 'does something else' do
    # ...
  end
end

或者你可以使用块

describe 'home page' do
  it_behaves_like 'a page' do
    before { visit '/' }
  end
end