如何覆盖Calabash预定义步骤?

时间:2015-04-06 22:03:02

标签: calabash calabash-ios calabash-android

我正在定义自定义的calabash步骤(在iOS和Android上使用),并希望有选择地覆盖各种预定义的步骤。一个例子是:

Given /^I press the "([^\"]*)" button$/ do |text|
  tap_when_element_exists("android.widget.Button {text CONTAINS[c] '#{text}'}")
end

我想提供自己的实现,而不是使用此实现。如果我定义并使用匹配正则表达式的步骤,我会收到错误:

Ambiguous match of "I press the "big red" button"

它还建议使用“--guess”,但这没有帮助,我仍然得到Cucumber::Ambiguous错误。 我可以对我的步骤进行一些任意改变,例如:

I tap the "big red" button

但由于一些原因,这感觉就像一个糟糕的解决方案

  • 必须防止使用内置步骤,特别是因为它可能是最自然的措辞
  • 如果canned_steps在将来的版本中添加了一个冲突的步骤,我将被迫改变我的措辞和我的所有场景
    • 似乎Android和iOS预定义步骤之间的措辞略有不同。如果我无法覆盖,这意味着我需要避免在Android上使用iOS预定义步骤,即使我在Android上出现Cucumber::Ambiguous错误。
  • 一般来说,我不喜欢告诉剧情作者(通常是QA)不使用特定的短语,我宁愿添加替代短语而不是删除选项

有没有办法取消定义内置步骤? android canned_step documentation表明应该有:You can add your own steps or change the ones you see here

我不想立即丢失所有预定义步骤(例如:不需要calabash_steps.rb)。我宁愿只在他们成为一个问题时逐步淘汰它们。 如果我可以帮助它,我不想直接编辑calabash代码,因为这需要滚动我自己的calabash发行版而不是使用gem来安装它。

1 个答案:

答案 0 :(得分:4)

  

我宁愿只在它们成为问题时逐步淘汰它们。如果我可以帮助它,我不想直接编辑calabash代码,因为这需要滚动我自己的calabash发行版而不是使用gem来安装它。

features/support/env.rb中,将require calabash-android/cucumber替换为

require 'calabash-android/color_helper'
require 'calabash-android/operations'

World(Calabash::Android::ColorHelper)
World(Calabash::Android::Operations)

然后将calabash-android固定步骤复制到项目features/step_definitions/canned_steps.rb中的文件中。

根据需要删除或替换预定义的步骤。

还有提升 - 我们正在研究Calabash 2.0:iOS和Android API的合并。我们正在谈论从新的calabash gem中删除预定义的步骤并将它们作为单独的gem分发。作为一个例子,我们看看rspec将行为分配为单独的宝石的方式。目前还没有做出任何决定。