黄瓜表达:我如何拥有严格的多字替代文字?

时间:2017-05-11 23:02:43

标签: javascript cucumber cucumberjs

我试图将基于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

我还尝试使用包含|字符的单个optional text,如下所示:

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

但是cuc-expressions-javascript故意escapes the | character,所以生成的RegExp看起来像这样:

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

有没有办法使用Cucumber表达式创建单个多字替代文本组?

3 个答案:

答案 0 :(得分:0)

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

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

此解决方案仍然没有我想要的那么严格,因为它将匹配以下字符串:

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

但我发现Cucumber Expression本身更易读,可以做多个替代文本。对于“正确”的方式,我仍然愿意接受其他建议。

答案 1 :(得分:0)

另一种选择是写下你的步骤,以便描述你所做的事情而不是你如何做到这一点

Given I am logged in

Give I am a visitor

通常避免使用正则表达式或表达式。就个人而言,我宁愿拥有

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

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

只有一个表达式才能同时执行这两个操作。我的理由是:

  1. 更容易搜索您的步骤defs和调用和重复的功能
  2. 它与具有调用和委托的步骤主体相结合,而不是执行内容的步骤主体。
  3. 更简单。我总是喜欢简单而且冗长而复杂而简洁。
  4. 我从来没有任何步骤说明我在哪个页面上,因为这就是我在做什么事情的情况应该只是关于什么和为什么。

    无论如何希望有一些用途。

答案 2 :(得分:0)

  

我最终得到了多个可选文本:

     

I (am on)(go to) the "{captureString}" page   这个解决方案仍然没有我想要的严格,因为它将匹配以下字符串:

     

I the "Login" page

     

I am ongo to the "Home" page

     

但是我发现黄瓜表达式本身比编写多个替代文本更具可读性。对于这样做的“正确”方式,我仍然持开放态度。

在变体之间添加斜杠“ /”将避免触发I am ongo to the "Home" page

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