2012-10-09 47 views
0

在SpecFlow中使用场景轮廓BDD: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 | 

我预计,“当”的步骤将被评价成这样:

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

而且该方案将运行4次 - 表的每一行,传递价值观的要求。 情况并非如此。

相反,SpecFlow创建1 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>" 

我也得到:

完美。

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

“你的步骤定义将永远不会有满足的占位符他们需要匹配将取代占位符的值。”

我实在不明白的值为表格的每一行编写单独的步骤定义。

这是针对SpecFlow的细微差别吗?

回答

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

将匹配

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

这样的文件是罚款。

你遇到的问题是,如果没有"...",步骤文本的自动生成不会预测插入什么正则表达式 - 我猜它必须用作指示器,表明您传递可互换字符串 - 可与“(。 *)“,但如果你不想要报价,你仍然可以手动纠正它。

+0

啊哈,这很有道理。一旦生成方法名称,我还没有尝试删除引号(也不是手动编写正则表达式!)。所以这只是SpecFlow自动方法名称生成中的一个'小故障' - 很简单! –

+0

对我来说,关键部分是区分“拉里”和拉里,因为在场景中名称带有引号和正则表达式需要与之匹配,但在场景大纲中名称不带引号。 – kaskelotti