与Capybara和SitePrism有哪种断言?

时间:2017-07-21 14:22:05

标签: ruby rspec capybara site-prism

我正在使用PageObject模式,该模式将HTML详细信息从测试的顶层抽象出来。我这样做是使用SitePrism gem。

在我的示例中,我有一个主页( HomePage.rb ):

class HomePage < SitePrism::Page
  set_url ENV['BASE_URL']
  section :header, HeaderSection, "div[class='headerSection']"

引用公共页面部分 HeaderSection HeaderSection.rb ):

class HeaderSection < SitePrism::Section
  element :sign_in_button, "a[class='signIn']"

和我的测试的步骤定义( login.rb ):

And(/^I am not logged in/) do
  @home_page = HomePage.new    # actually, this is specified in env.rb     
  expect(@home_page.header).to have_sign_in_button
end

我希望将此元素封装在 HomePage 的类方法中,而不是将Web元素暴露给步骤定义。似乎最好的方法是将断言放入 HomePage 本身的一个类方法中( HomePage.rb ):

def amILoggedIn
  expect(header).to have_sign_in_button
end

以上假设我也在使用include RSpec::Matchers

我的方法将是唯一暴露于步骤定义的方法( login.rb ):

And(/^I am not logged in/) do
  @home_page.amILoggedIn
end

作为SitePrism的一部分,sign_in_button元素有自己的内置方法来检查它的存在,即:

header.has_sign_in_button?

问题

就最佳实践而言,这是在amILoggedIn方法中编写此断言的最佳推荐方式(即使看起来它们都使用相同的指令),

expect(header).to have_sign_in_button

header.has_sign_in_button?

2 个答案:

答案 0 :(得分:1)

expect(header).to have_sign_in_buttonheader.has_sign_in_button?执行两项不同的操作。第一个是断言(如果失败则引发异常),第二个只返回一个布尔响应。如果您想要的是断言,您可以在布尔响应assert header.has_sign_in_button?expect(header.has_sign_in_button?).to be true上断言,但来自have_sign_in_button的失败消息将更具描述性。

答案 1 :(得分:0)

旧问题,但提供了最新答案

Given SitePrism现在默认使用隐式等待,因为Thomas曾说过,您有两个不同的方法签名和两个不同的输出。

还取决于您与谁交谈,因此在各个地方包含匹配器被认为是一种不好的做法。将Cucumber与SitePrism结合使用可以很好地分离关注点,以便在Cucumber World中进行测试(step_definitions),并将所有其他建模关注点隔离到支持代码中。

使用官方文档中所述的SitePrism,您(使用黄瓜时)将允许您访问黄瓜世界中的所有rspec方法,并轻松有效地进行测试。