specflow: - “步骤中找到不明确的步骤定义”,当1步比其他步更多时

时间:2012-12-07 12:53:36

标签: .net unit-testing specflow

目前我们已经迈出了这一步:

[When(@"I set the scenario price for product (.*) to (.*)")]
public void WhenISetTheScenarioPriceForProductPToN(string product, string priceStr)

我想补充一步:

[When(@"I set the scenario price for product (.*) to (.*) in the (.*) zone")
public void WhenISetTheScenarioPriceInZoneForProductPToN(string product, string priceStr, string zone)

但是,规范流程会在两个步骤之间产生“步骤中出现模糊步骤定义”错误。

我累了:

  [When(@"I set the scenario price for product (.*) to (.*) in the (.*) zone")]
  [When(@"I set the scenario price for product (.*) to (.*)")]
  public void WhenISetTheScenarioPriceInZoneForProductPToN(string product, string priceStr, string zone)

但是因为"绑定错误而失败:参数计数不匹配!"我希望它会在第二个"当"。

时传递null

2 个答案:

答案 0 :(得分:11)

问题是你的(。*)。这可以扩展到匹配“abc区域中的xyz”。你可以只匹配一个单词吗?即(\ w +)

[When(@"I set the scenario price for product (.*) to (\w+)")]

这样就可以防止abc区域中的正则表达式匹配更短。

您可以通过注释掉更长的时间来测试这个属性和方法以及调试以查看与较短的匹配项。

此外,您必须始终使用相同数量的正则表达式作为参数,这就是组合后的正则表达式不起作用的原因。


这对我不起作用,这是由于价格为“0.99”和“。”。没有被\ w匹配。然而,这有效:

[When(@"I set the scenario price for product (.*) to (\S+)")]
public void WhenISetTheScenarioPriceForProductPToN(string product, string priceStr)

因为我们的“测试值”中没有空格。

答案 1 :(得分:3)

我最初认为这是因为第一步定义结束时的正则表达式:

[When(@"I set the scenario price for product (.*) to (.*)")]

它将捕获(或匹配)进入后续定义的相同字符串。

但是,这两步实现方法包含不明确的参数类型。我最初无法重现这一点,因为我使用了int(根据我的评论),但使用string可以重现此问题,因为string不明确。在步骤定义文件中作为参数提供的任何参数都可以视为string

将步骤方法更改为以下内容:

public void WhenISetTheScenarioPriceInZoneForProductPToN(string product, double price, string zone)

public void WhenISetTheScenarioPriceForProductPToN(string product, double price)

现在虽然正则表达式没有改变,所以理论上仍然会贪婪地匹配,SpecFlow提供转换为原始类型(以及通过自定义转换的其他类型),因此忽略句子的其余部分。这意味着它没有歧义,因为它检测string之后的最终double参数(而不是无法判断句子的一部分是否与字符串参数匹配或嵌入了更多参数)