0

你看,有时在我的代码中我需要放置一个全局变量来设置 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”变量而不存在维护问题或歧义?

4

2 回答 2

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

于 2014-10-15T04:39:26.770 回答
0

正如人们所逃避的那样,黄瓜世界中的实例变量约定是共享状态。

因此,您将始终能够访问@home_pageWorld 中的变量或任何其他变量。

有关更多信息,请参见此处:https ://github.com/natritmeyer/site_prism#epilogue

于 2019-02-22T12:31:48.253 回答