正则表达式匹配黄瓜但不捕获它

时间:2017-03-23 03:26:04

标签: cucumber specflow gherkin

我使用specflow使用Gherkin语法编写浏览器测试。我有一个步骤定义,我想匹配2个不同的步骤但不捕获它。例如:

Scenario:
  Given I have some stuff
  And I click on the configure user 
  And I configure user
  And I set the user <config> to <value>
  Then I should see user configuration is updated

Scenario:
  Given I have some stuff
  And I click on the configure admin
  And I configure admin
  And I set the admin <config> to <value>
  Then I should see user configuration is updated

And I set the admin <config> to <value>的步骤定义正则表达式如下:

Given(@"And I set the admin (.*) to (.*)")
public void AndISetTheAdminConfigToValue(string config, string value) 
{
    // implementation
}

And I set the user <config> to <value>就像:

Given(@"And I set the admin (.*) to (.*)")
public void AndISetTheUserConfigToValue(string config, string value) 
{
    // implementation
}

两个步骤的实施是相同的。所以我想做的是:

Given(@"And I set the user|admin (.*) to (.*)")
public void AndISetTheConfigToValue(string config, string value) 
{
    // implementation
}

以上代码无效,configvalue参数将为空字符串,useradmin被捕获为前2个参数。

有没有办法在不捕获参数中的正则表达式匹配的情况下执行上述操作?

我知道我可以简单地重写方案如下以解决问题。但我只是好奇。

Scenario:
  Given I have some stuff
  And I click on the configure admin
  And I configure admin
  And I set the <config> to <value>
  Then I should see user configuration is updated

2 个答案:

答案 0 :(得分:3)

使用AlSki提供的基线:

使用可选组也是一个选项:

[Given(@"I set the (?:user|admin) (.*) to (.*)"]
public void ISetTheConfigValue(string config, string value)

这意味着您不必包含您永远不会使用的参数。

我建议摆脱讨厌的(.*)正则表达式,它将匹配您放在那里的任何内容和所有内容 - 如果您想要获取该用户可以拥有的权限的步骤,则稍后会遇到问题(作为一个例子):

Given I set the user JohnSmith to an admin with example privileges

所以我个人会用这个:

[Given(@'I set the (?:user|admin) "([^"]*)" to "([^"]*)"']
public void ISetTheConfigValue(string config, string value)

哪个匹配:

Given I set the user "JohnSmith" to "SysAdmin"
And I set the admin "JaneDoe" to "User"

但不匹配

Given I set the user JohnSmith to an admin with example privileges

答案 1 :(得分:2)

首先要注意在同一个绑定中有多个(.*),否则会导致错误的模式。

如果没有检查,我很确定可以在方法上提供多个绑定,只要它们具有相同的参数计数,即

 [Given("I set the user (.*) to (.*)"]
 [Given("I set the admin (.*) to (.*)"]
 public void ISetTheConfigValue(string config, string value)  

或者,您始终可以添加虚拟参数

 [Given("I set the (user|admin) (.*) to (.*)"]
 public void ISetTheConfigValue(string _, string config, string value)