如何使用 Capybara Rspec Matchers 测试演示者?
Posted
技术标签:
【中文标题】如何使用 Capybara Rspec Matchers 测试演示者?【英文标题】:How to use Capybara Rspec Matchers to test a presenter? 【发布时间】:2012-04-18 13:31:57 【问题描述】:我正在尝试使用 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 匹配器?
【问题讨论】:
【参考方案1】:尽管 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
【讨论】:
【参考方案2】:查看Capybara.string
方法:http://rubydoc.info/github/jnicklas/capybara/master/Capybara#string-class_method
用这个方法你应该可以写出类似的东西:
subject Capybara.string(presenter.render_controls
it should have_button('Vote')
【讨论】:
以上是关于如何使用 Capybara Rspec Matchers 测试演示者?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Capybara Rspec Matchers 测试演示者?
如何在 Capybara 和 RSpec 中测试 CSV 文件下载?
使用 RSpec + capybara-webkit 检查 JS 框是不是存在