1

我正在使用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

我不想将 Web 元素暴露给步骤定义,而是将其封装在HomePage的类方法中。似乎最好的方法是将断言放入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?
4

2 回答 2

2

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将更具描述性。

于 2017-07-21T17:34:20.660 回答
0

老问题,但提供更新的答案

鉴于 SitePrism 现在默认使用隐式等待,正如 Thomas 所说,您有两个不同的方法签名和两个不同的输出。

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

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

于 2019-02-22T14:12:13.147 回答