在 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
有没有一种简单的方法可以在 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