2012-04-04 4 views
4

J'essaye de tester une méthode de présentateur en utilisant un matcher Capybara RSpec.Comment utiliser Capybara Rspec Matchers pour tester un présentateur?

Disons que j'ai une méthode qui rend un bouton. Ce serait le test j'écrire si je n'utilisais pas capybara 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 

L'utilisation matchers de rspec capybara, je veux faire:

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

Cette approche a été proposée dans cet article http://devblog.avdi.org/2011/09/06/making-a-mockery-of-tdd/. Dans l'article, l'auteur l'explique ainsi: "J'ai décidé de changer un peu ma configuration afin de passer un objet modèle incluant les helpers de tag Rails, puis j'ai inclus les matcheurs de Capybara pour faire des assertions HTML. "

Cependant, je ne comprends pas cela. Comment pouvez-vous utiliser les coupleurs capybara rspec quand render_controls ne renvoie qu'un content_tag?

Répondre

6

Même si la réponse de luacassus est correcte, j'ai trouvé quel était le problème. Je n'incluais pas les coupleurs capybara rspec dans le test. Si vous n'incluez pas les coupleurs Capybara rspec, vous aurez une erreur comme celle-ci: la méthode undefined has_selector? pour ActiveSupport :: SafeBuffer: 0x9449590.

Lorsque vous incluez les coupleurs rspec, il n'est pas nécessaire d'utiliser la méthode Capybara String, car les coupleurs rspec correspondent déjà à une chaîne.

Je laisse ici un exemple plus détaillé.

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 
Questions connexes