BDD:SpecFlow - 场景大纲行为不符合预期

时间:2012-10-09 15:15:12

标签: cucumber bdd specflow gherkin

在SpecFlow中使用场景轮廓,例如

Scenario Outline: Invalid Login Details

Given some pre-conditions...
When user "Larry" enters username <username> and password <password>
Then the message "Invalid Login Details" should be displayed

Examples:
|username|password|
|larry06 |        |
|larry06 |^&*%*^$ |
|%^&&**  |pass123 |
|        |pass123 |

我期望“When”步骤将被评估为:

public void WhenUserEntersUsernameAndPassword(String username, String password){}

该场景将运行4次 - 对于表的每一行,根据需要传递值。 情况并非如此。

相反,SpecFlow会创建4个必需步骤定义中的一个:

[When(@"""(.*)"" provides the following new username larry(.*) and password ")]
public void WhenUserEntersUsernameLarryAndPassword(string p0, int p1)
{
//TODO
}

为了让剩下的3个'工作',我需要手动编写明确匹配表中其他值的方法。

因为意识到我可以说:

When "Larry" enters username "<username>" and password "<password>"

我得到了:

[When(@"""(.*)"" provides the following ""(.*)"" and ""(.*)""")]
public void WhenUserEntersUsernameAndPassword(string p0, string name, string pass)
{
//TODO
}

完美。

但是所有文档似乎都表明我不需要“”,这应该可行(例如https://github.com/cucumber/cucumber/wiki/Scenario-outlines)。我注意到了:

  

“您的步骤定义永远不会与占位符匹配。他们需要匹配将替换占位符的值”

我真的没有看到为表格的每一行写单独的步骤定义的价值。

这种细微差别是否特定于SpecFlow?

1 个答案:

答案 0 :(得分:2)

When "Larry" enters username <username> and password <password>

将匹配

[When(@"""(.*)"" enters username (.*) and password (.*)")]
public void WhenEntersUsernameAndPassword(string p0, string name, string pass)
{
//TODO
}

所以文档很好。

您遇到的问题是,自动生成步骤文本并不能预测在没有"..."的情况下要插入的正则表达式 - 我猜它必须用作指示您传递可互换的字符串 - 与之匹配“(。*)”,但是如果你不想要引号,你仍然可以手动纠正它。