我目前正在重构一整堆黄瓜测试以使用“页面对象”模式,但是我在使用RSpec匹配器时遇到了很多问题。
我现有的步骤如下:
Then /^I should (not )?see the following alerts:$/ do |negate, alerts|
expectation = negate ? :should_not : :should
within(ALERT_TABLE_ID) do
alerts.hashes.each do |alert|
page.send(expectation, have_content(alert["Original ID"]))
end
end
end
我的重构步骤是:
Then /^I should (not )?see the following alerts:$/ do |negate, alerts|
expectation = negate ? :should_not : :should
@alert_reporting_panel = AlertReportingPanel.new(Capybara.current_session)
@alert_reporting_panel.verify_contents expectation, alerts
end
我的Panel对象是:
class AlertReportingPanel
def initialize(session)
@session = session
end
def verify_contents(expectation, alerts)
@session.within(ALERT_TABLE_ID) do
alerts.hashes.each do |alert|
@session.send(expectation, have_content(alert["Original ID"]))
end
end
end
end
不幸的是,我得到undefined method 'have_contents' for #<AlertReportingPanel:0x3f0faf8> (NoMethodError)
我尝试将require 'rspec'
添加到课程顶部,并尝试完全限定have-content
方法:Capybara::RSpecMatchers::HaveMatcher.have_content
,但我得到uninitialized constant Capybara::RSpecMatchers (NameError)
。
我对Ruby很陌生,我确信这很难修复......但我似乎无法为自己解决这个问题。
请帮忙。三江源。
答案 0 :(得分:3)
这已经有一段时间了,所以我猜你现在可能已经得到了你的答案,但现在就去了。
您需要包含必要的模块才能引入并访问* have_content *之类的内容。所以你的Panel对象看起来像是:
class AlertReportingPanel
include Capybara::DSL
include Capybara::Node::Matchers
include RSpec::Matchers
def initialize... etc
答案 1 :(得分:1)
您可以尝试使用SitePrism
,而不是编写自己的Page Object系统我有点偏颇(我写了那个宝石)但它可能会让你的生活更轻松。