我试图将基于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表达式创建单个多字替代文本组?
答案 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
只有一个表达式才能同时执行这两个操作。我的理由是:
我从来没有任何步骤说明我在哪个页面上,因为这就是我在做什么事情的情况应该只是关于什么和为什么。
无论如何希望有一些用途。
答案 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