2015-06-12 4 views
1

Я пытаюсь использовать shared_examples как способ повторения ожиданий на нескольких маршрутах. В частности, я хочу проверить, загружаются ли какие-либо статические активы в моем верхнем и нижнем колонтитулах. Однако, я получаю сообщение об ошибке:RSpec - тестирование нескольких ожиданий по маршрутам

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 

Оба терпят неудачу по той же самой причине выше. Итак, если я хочу проверять одни и те же вещи на каждой странице, что является лучшим решением?

ответ

3

В 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 
+0

Это сработало! Бесконечно благодарен! Я только начал с rspec/capybara и до сих пор привык к соглашениям. – user3162553

Смежные вопросы