RSpec - 测试跨路线的多个期望

时间:2015-06-12 19:00:45

标签: ruby testing rspec sinatra capybara

我正在尝试使用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 

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

1 个答案:

答案 0 :(得分:5)

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