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

Share @variable in step_definitions and PageObject methods possible?

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

在 Calabash 文档中使用 @current_page 的示例会强制您始终执行以下操作:

@current_page = @current_page.login(user)

login 之后,您进入了一个新页面,您必须为 @current_page 传回对此的引用。最好在 login 方法中设置 @current_page 而不必在每次调用将您带到新页面的方法时都执行 @current_page = @current_page.login(user) 赋值。

有什么好的方法吗?

Is there a good way to do this?

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

我可以演示多种保留引用的方法,但我不想这样做,因为这不是一个好的模式。

我的回答可能会被标记为未回答,我会尝试解释原因。

Examples using the @current_page in the Calabash docs force you to always do something like:

在我看来,文档不是很好。我一直在努力让他们改变。 Calabash 开发人员就此主题达成了普遍共识,但我们 none 有时间更改它们。

使用 @current_page 跟踪步骤之间的当前页面不是最佳做法。原因是 reader 永远无法仅通过查看就知道 @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

force you to always do something like:

@current_page是一个Cucumber World变量;没有什么特别的。它可能被称为:@page@screen@foobar。当我说没有什么特别的时候,我的意思是 Calabash 在内部的任何地方都不使用 @current_page

It would be nice to just set @current_page in the login method and not have to do that @current_page = @current_page.login(user) assignment every time you call a method that brings you to a new page.

Is there a good way to do this?

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

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

 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