你知道,有时在我的代码中,我需要设置一个全局变量来设置current_page(在一个步骤中)并重用它(在其他步骤中)
Then /^I open the "(.*?)" form$/ do |form_type|
form_page = "#{form_type}_page"
@current_page = @home_page.send(form_page.to_sym)
# here current page is not always the same page but they all have the open_form method
@current_page.open_the_form
end
Then /^I should ....$/ do
# here current_page reuse the data from the previous step
@current_page.do_something
# but sometimes, we dont know where is set the variable "current_page"
end
但是我的同事有一些维护问题,因为有时候,当我们阅读代码时,我们不明白哪个页面是@current_page?
在这种情况下,最佳做法是什么。
你如何使用" current_page"变量没有维护问题或含糊不清?
答案 0 :(得分:2)
在我的团队中,我已经建立了一条规则,即我们的全局页面变量应始终始终引用正确的模型。我们不是直接设置模型,而是使用一些帮助器。
我们还建立了一个约定,即页面定义和步骤在同一个文件中。示例 some_page.rb
class SomePage < SitePrism::Page
set_url '/lol'
set_url_matcher /#{@target}\/lol/
element :button, 'button'
element :some_image, 'img'
end
Given /^I have reached SomePage$/ do
load_page SomePage
end
When /^I click a button on Some Page$/ do
@page.button.click
end
Then /^I should be on Some Page$/ do
ensure_page SomePage
end
Then /^Some Page should have an image$/ do
@page.should have_some_image
end
这可能看起来很奇怪,并且违背各种最佳做法 - 但它对我的团队来说非常有用。通过将步骤定义与各自的页面结合在一起,您始终可以确切地知道@page在您的定义中引用的内容,并且查找并查看元素被映射的内容(或添加更多映射)更容易。您还可以获得快速了解您已为任何特定页面编写的步骤,这样可以减少重复的步骤定义。
在极少数情况下,一个步骤定义用于多个页面,然后我们有一个单独的帮助文件。
我们有一些帮助器用于设置和使用全局@page变量。使用这些,另一个约定是永远不会@page = SomePage.new
或@page.should be_displayed
set_page用于将全局变量设置为提供的页面的实例。它还确保显示预期的页面,并调用page#set_up。我们所有的页面都继承自一个masterpage类,它有一个空的set_up方法。我们可以在页面上定义set_up,以便在特定页面加载时添加任何类型的初始化代码。
def set_page page_model
@page = page_model.new
# Ensure the expected page is actually displayed
ensure_page page_model
# Call the set_up method on the page
@page.set_up
end
ensure_page。它既用于确保全局变量引用正确的页面,也用于确保页面当前显示。这用于代替传统的PageModel.new.should be_displayed
def ensure_page page_model
unless @page.is_a? page_model
raise PageModelIncorrect.new "@page is a #{@page.class} when #{page_model} was expected.\nCurrent URL: #{current_url}"
end
@page.should be_displayed
end
使用load_page而不是传统的PageModel.new.load args
。它使用提供的参数自动加载页面,然后使用上面的方法设置全局变量,然后确保页面显示。
def load_page(page_model, *args)
page = page_model.new
page.load(*args)
set_page page_model
end
答案 1 :(得分:0)
人们逃避了,黄瓜世界中的实例变量约定是共享状态。
因此,您将始终能够访问@home_page
变量或世界内部的任何其他变量。
有关更多信息,请参见此处:https://github.com/natritmeyer/site_prism#epilogue