4

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

假设我有一个呈现按钮的方法。如果我不使用 capybara 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

这种方法是在这篇文章http://devblog.avdi.org/2011/09/06/making-a-mockery-of-tdd/中提出的。在文章中,作者是这样解释的:“我决定稍微改变一下我的规范设置,以便传入一个包含实际 Rails 标记助手的模板对象。然后我包括了 Capybara 规范匹配器,用于对 HTML 进行断言。”

但是,我不明白这一点。当 render_controls 只返回一个 content_tag 时,如何使用 capybara rspec 匹配器?

4

2 回答 2

6

即使 luacassus 的回答是正确的,我也发现了问题所在。我没有在测试中包括 capybara rspec 匹配器。如果你不包括 Capybara rspec 匹配器,你会出现这样的错误: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
于 2012-04-11T01:40:19.600 回答
5

查看Capybara.string方法:http ://rubydoc.info/github/jnicklas/capybara/master/Capybara#string-class_method

使用这种方法,您应该能够编写类似的内容:

subject { Capybara.string(presenter.render_controls }
it { should have_button('Vote') }
于 2012-04-07T19:27:09.547 回答