我有一个网站在移动版和桌面版的前端完全不同。
在 Cucumber 上定义步骤时,您无法确定步骤的范围,因此我坚持使用两种解决方案(如我所见):
- 写下与其他版本冲突的每一步,明确说明我是哪个版本
- 设置一个“背景”,告诉我我的上下文是什么,并更改所有步骤定义以检查此上下文
这些对我来说似乎都不是最优的。
有没有更好/更清洁的方法来做到这一点?
您可以为此使用标签和挂钩,用它测试的站点版本标记每个场景/功能:
@mobile
Scenario: Logging in on mobile
Given I visit the login page
@desktop
Scenario: Logging in on desktop
Given I visit the login page
使用一些钩子来设置一个变量来指示正在测试的站点的版本:
Before '@mobile' do
@version = :mobile
end
Before '@desktop' do
@version = :desktop
end
然后在您的步骤中:
Given /^I visit the login page$/ do
if @version == :desktop
# Desktop specific code
elsif
# Mobile specific code
else
raise "Don't know what to do!"
end
end
我最终使用了类似于 Jon M 的解决方案。
对于并发步骤,我做了一个“元”步骤,传递到正确的上下文。这是一个例子:
When /^I log in$/ do
step %Q{I log in on #{@context}}
end
然后在另一个文件中(由上下文分隔)我有:
When /^I log in on mobile$/ do
# do stuff
end
为了设置上下文,我创建了一个支持模块。基本上,它会保留当前上下文,并且还有一个默认上下文,您可以通过一个步骤进行更改:
Given /^I am on the "(.*?)" version$/ do |version|
@context = version
end
这不完全是我设置上下文部分的方式,但你明白了。
这样做的好处是,我可以拥有无限的上下文,并且这个“元”步骤将拾取它们。我也没有臃肿的脚步。每个步骤都很简单,只处理它自己的上下文逻辑。
不利的一面是,对于我拥有的每个非默认上下文,我都需要一个背景来说明我处于不同的上下文中。
我不会在这里接受正确的答案,因为没有这样的事情。你可以用不同的方法来处理它,直到现在,甚至还没有关于这个的最佳实践:)