Cucumber / Capybara - 使用具有“页面对象”模式的RSpec匹配器

时间:2012-07-24 15:01:09

标签: ruby rspec capybara

我目前正在重构一整堆黄瓜测试以使用“页面对象”模式,但是我在使用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很陌生,我确信这很难修复......但我似乎无法为自己解决这个问题。

请帮忙。三江源。

2 个答案:

答案 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系统

我有点偏颇(我写了那个宝石)但它可能会让你的生活更轻松。