我正在使用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?
答案 0 :(得分:1)
expect(header).to have_sign_in_button
和header.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方法,并轻松有效地进行测试。