Cucumber表达式:如何在严格模式下使用多个单词的备选文本?

4

我正在尝试将基于RegExp的Cucumber v1步骤定义转换为基于Cucumber Expression的Cucumber v2.0.0-rc.9步骤定义。我有一些使用正则表达式的步骤定义,如下所示:

/^I (?:am on|go to) the "([^"]*)" page$/

那样,我就能在我的特性文件中写下以下内容之一:
I am on the "Login" page
I go to the "Home" page

我想转换为Cucumber表达式,以便开始使用自定义参数,但我找不到一个很好的方法来复制(?:am on|go to)。我能想到的最好办法就是使用多个alternative texts
I am/go on/to the "{captureString}" page

我不喜欢这种方法的原因是它允许编写以下无意义的步骤:
I am to the "Login" page

我也尝试使用一个包含 | 字符的单个 可选文本,如下所示:
I (am on|go to) the "{captureString}" page

但是cucumber-expressions-javascript有意地转义了|字符,因此生成的RegExp看起来像这样:

/^I (?:am on\|go to)? the "([^"]*)" page$/

有没有办法使用Cucumber表达式创建一个包含多个单词的替代文本组?

4个回答

5
我最终采用了多个可选文本: I (am on)/(go to) "{captureString}"页面 这种解决方案仍然不够严格,因为它将匹配以下字符串: I "Login"页面 但我发现 Cucumber 表达式本身比使用多个替代文本更易读。对于“正确”的做法,我仍然开放其他建议。
在变体之间添加斜杆 '/' 可消除触发 I am ongo to the "Home" page 的情况: I (am on)/(go to) "{captureString}" 页面

1
最佳选择是使用可选文本替代文本的组合。
I (am on)/(go to) the "{captureString}" page

以下是涵盖的情况:

  • 我在“登录”页面
  • 我进入“主页”

1
一种替代方法是编写步骤,使其描述您所做的事情而不是如何做事情。
给定我已登录。
给定我是一个访客。
通常应避免使用正则表达式或表达式。个人而言,我宁愿有...
Given 'I am logged in' do 
  login user: @i
end

Given 'I have logged in' do
  login user: @i
end

比起拥有一个表达式来执行两个操作,我更希望拥有两个单独的表达式分别执行它们。我的理由是:

  1. 更容易在step defs和features中搜索调用和重复的内容
  2. 它很好地结合了使用调用和委派的步骤体,而不是执行具体操作的步骤体。
  3. 更简单。我总是更喜欢简单并略显冗长的方式,而不是复杂而简洁的方式。

我从来没有任何一步说我在哪个页面上,因为那完全是关于我如何做事情,而场景应该只涉及到什么和为什么。

总之希望能对您有所帮助。


0

最终我选择了多个可选文本:

I (am on)(go to) the "{captureString}" page

这个解决方案仍然不够严格,因为它会匹配以下类似的字符串:

I  the "Login" page
I am ongo to the "Home" page

但我发现与其使用多个替代文本,Cucumber表达式本身更易读。我仍然开放对于“正确”的方法的其他建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接