我的正则表达式在黄瓜中无法识别 - 帮助!

时间:2011-03-10 23:52:26

标签: ruby-on-rails regex cucumber

所以这是一个非常新的问题。

我有一个看起来像这样的步骤:

Then /^I should see ((phrase 1) | (phrase 2))$/ do
  #stuff
end

之后,我有一个看起来像这样的步骤:

Then /^I should see phrase 3$/ do
  And %{I should see phrase 2}
end

我正在尝试测试注册流程。

phrase 1描述了需要填写的所需信息,我需要验证它们是否显示在用户的个人资料中。

phrase 3描述了用户填写所需的可选信息。可选信息应该显示在用户的个人资料中,我想测试它也会显示出来。

我不想复制和粘贴第一步中的内容,所以我重新措辞phrase 1,以便从phrase 3步骤调用它是有道理的,但我不知道知道如何在第一步中正确引用它以使其工作。我从Cucumber获得的是I should see phrase 2未定义。

这项工作的正确方法是什么?有没有更好的方法来实现我的目标?

1 个答案:

答案 0 :(得分:4)

空白字符在正则表达式中非常重要

如果管道两端都有空格,则需要使用此步骤:

Then %{I should see phrase 1 }

Then %{I should see  phrase 2}

(注意第一个末端的额外空格,第二个末尾的seephrase2之间的额外空间)。正则表达式仍在查找您指定它们的空格字符。

您的正则表达式需要更改为:

Then /^I should see (phrase 1|phrase 2)$/ do |phrase_name|

end

正则表达式中的|符号将匹配 左侧的所有字符,右侧的所有字符(当然,parantheses对其进行限制)所以它不需要整个字符串。)

此外,您必须将值传递给块,就像我使用phrase_name一样,当您以这种方式使用括号时。虽然我可能更愿意看到这样定义的步骤:

Then /^I should see phrase ([\d]+)$/ do |phrase_number|

end

因此它将匹配您的所有三种短语类型,并且您将不再需要短语1定义。 [\ d] +将匹配任何数字字符1次或更多次。

然后,您可以根据发送的phrase_number做任何您需要做的事情。我有兴趣看到你的情景定义,但我不确定你是否正在根据这些信息正确地进行调整。如果我看到故事的其余部分,也许我可以得到一些背景。