我使用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
}
以上代码无效,config
和value
参数将为空字符串,user
和admin
被捕获为前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
答案 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)