2

Is there an easy way to reference @current_page in both the step_definition.rb files and the PageObject.rb files?

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

@current_page = @current_page.login(user)

After login you are on a new page and you must pass back a reference to this for the @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?

4

1 回答 1

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_pageCucumber World 变量;它没有什么特别之处。它可能被称为: @page@screen@foobar@current_page当我说没有什么特别之处时,我的意思是 Calabash在内部的任何地方都没有使用。

最好只在登录方法中设置@current_page 而不必在每次调用将您带到新页面的方法时都进行@current_page = @current_page.login(user) 分配。

有没有好的方法来做到这一点?

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

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

 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
于 2015-03-24T09:35:32.283 回答