可以在step_definitions和PageObject方法中共享@variable吗?

时间:2015-03-23 20:41:56

标签: ruby cucumber calabash calabash-ios

是否有一种简单的方法可以在step_definition.rb文件和PageObject.rb文件中引用@current_page?

在Calabash文档中使用@current_page的示例迫使您总是执行以下操作:

@current_page = @current_page.login(user)

login之后,您处于新页面,并且必须将@current_page的引用传回给它。最好只在@current_page方法中设置login,而不必在每次调用将您带到新页面的方法时执行@current_page = @current_page.login(user)分配。

这样做有好办法吗?

1 个答案:

答案 0 :(得分:4)

  

有没有好办法呢?

不建议您保留对当前页面的引用。

我可以展示一些保持参考的方法,但我不想这样做,因为它不是一个好的模式。

有可能将我的回复标记为无回答,我会尝试解释原因。

  

在Calabash文档中使用@current_page的示例迫使您总是执行以下操作:

在我看来,文档并不好。我一直试图让他们改变。 Calabash开发人员对此主题达成了一致意见,但我们都没有时间对其进行更改。

使用@current_page跟踪步骤之间的当前页面是的最佳做法。原因是读者永远不会知道@current_page的价值只是通过观察它:它可以通过后续步骤设置为任何东西。

最佳做法是在需要时创建临时页面对象。

# Bad
@current_page = @current_page.login(user)

# Good
login_page = page(LoginPage).await
some_other_page = login_page.login(user)
some_other_page.await
  

强迫你总是这样做:

@current_page是黄瓜世界变量;这没什么特别的。可以称之为:@page@screen@foobar。当我说没有什么特别之处时,我的意思是Calabash在内部任何地方都不使用@current_page

  

在login方法中设置@current_page会很高兴,而不是每次调用一个方法将@current_page = @ current_page.login(用户)分配到新页面时都这样做。

     

有没有好办法呢?

一般来说,在黄瓜测试或页面模型中保存状态并不是一个好主意。如果您需要步骤或方法中的一条信息,您应该通过查询应用程序来询问它。

当然有例外。想象一个带有 Dashboard 页面的应用程序,该页面带有提醒图标,其徽章数量代表未读提醒的数量。

 Scenario:  Verify the reminders badge count
   Given I am looking at the Dashboard
   And I make a note of the reminders badge count
   When I go to the reminders page
   Then the reminders badge count should match the unread reminders

将徽章计数存储在Cucumber World变量中是合理的,这样您就可以在后续步骤中使用它。

 And(/^I make a note of the reminders badge count$/) do
   dashboard = page(Dashboard).await
   @reminder_badge_count = dashboard.reminder_badge_count
 end

 When(/^I go to the reminders page$/) do
   dashboard = page(Dashboard).await
   dashboard.navigate_to(:reminders)
 end

 Then(/^the reminders badge count should match the unread reminders$/) do
   reminders_page = page(Reminders).await
   unread_actual = reminders_page.unread_reminders
   unless unread_actual == @reminder_badge_count
     screenshot_and_raise("Expected badge count '#{@reminder_badge_count}' to match unread count '#{unread_actual}") 
   end
 end