Ruby on rails 如何使用水豚Rspec匹配器测试演示者?

Ruby on rails 如何使用水豚Rspec匹配器测试演示者?,ruby-on-rails,rspec,capybara,presenter,Ruby On Rails,Rspec,Capybara,Presenter,我正在尝试使用水豚RSpec匹配器测试演示者方法 假设我有一个呈现按钮的方法。如果我没有使用水豚rspec匹配器,我会编写以下测试: 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 使用capybara rspec

我正在尝试使用水豚RSpec匹配器测试演示者方法

假设我有一个呈现按钮的方法。如果我没有使用水豚rspec匹配器,我会编写以下测试:

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
使用capybara rspec匹配器,我想执行以下操作:

it "should render a vote button" do
  subject.render_controls.should have_button('Vote')
end
本文提出了这种方法。在本文中,作者这样解释:“我决定稍微修改一下规范设置,以便传入一个模板对象,其中包含实际的Rails标记帮助程序。然后,我加入了水豚规范匹配程序,用于对HTML进行断言。”


然而,我不明白这一点。当呈现控件仅返回内容标记时,如何使用capybara rspec匹配器?

签出
capybara.string
方法:

使用此方法,您应该能够编写如下内容:

subject { Capybara.string(presenter.render_controls }
it { should have_button('Vote') }

尽管卢卡萨斯的回答是正确的,但我发现了问题所在。我没有在测试中包括水豚rspec匹配器。如果您不包括Capybara rspec匹配器,您将出现如下错误:未定义的方法有\u选择器?对于ActiveSupport::SafeBuffer:0x9449590

当包含rspec匹配器时,不需要使用Capybara字符串方法,因为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