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