2012-04-04 3 views
4

Я пытаюсь протестировать метод презентатора с помощью сопоставителя RS-кода Capybara.Как использовать Capybara Rspec Соединители для тестирования ведущего?

Допустим, у меня есть метод, который дает кнопку. Это будет тест, который я хотел бы написать, если бы я не использовал водосвинка Rspec matchers:

it "should generate a button" do 
    template.should_receive(:button_to).with("Vote"). 
    and_return("THE_HTML") 
    subject.render_controls.should be == "THE_HTML" 
end 

Использование водосвинка Rspec matchers, я хочу сделать это:

it "should render a vote button" do 
    subject.render_controls.should have_button('Vote') 
end 

Этот подход был предложен в этой статье http://devblog.avdi.org/2011/09/06/making-a-mockery-of-tdd/. В статье автор объясняет это следующим образом: «Я решил немного изменить настройку спецификации, чтобы передать объект шаблона, который включал в себя фактические помощники тегов Rails. Затем я включил spec-элементы Capybara для составления утверждений о HTML «.

Однако я не понимаю этого. Как вы можете использовать capybara rspec matchers, когда render_controls возвращает content_tag?

ответ

6

Даже если ответ luacassus является правильным, я обнаружил, что проблема была. В тесте я не включал capybara rspec matchers. Если вы не включили Capybara rspec matchers, появится такая ошибка: undefined method has_selector? для ActiveSupport :: SafeBuffer: 0x9449590.

Когда вы включаете маркеры rspec, нет необходимости использовать метод Capybara String, так как совпадения rspec со строкой уже есть.

Я оставляю здесь более подробный пример.

require_relative '../../app/presenters/some_presenter' 
require 'capybara/rspec' 

describe 'SomePresenter' 
    include Capybara::RSpecMatchers 

    let(:template) { ActionView::Base.new } 
    subject { Presenter.new(template) } 

    it "should render a vote button" do 
    subject.render_controls.should have_button('Vote') 
    end 
end 
Смежные вопросы