10

目前我们有这一步:

[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。

4

2 回答 2

11

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

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

这也将阻止 abc 区域中较短的正则表达式匹配。

您可以通过注释掉较长的 When 属性和方法并调试以查看与较短的匹配的内容来测试这一点。

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


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

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

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

于 2012-12-07T13:17:26.760 回答
4

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

[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(而不是无法确定句子的一部分是否与字符串参数匹配或嵌入了更多参数)。

于 2012-12-07T12:57:45.303 回答