Using scenario outlines in SpecFlow, e.g.

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 |

I expected that the "When" step would be evaluated as such:

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

And that the scenario would be run 4 times - for each row of the table, passing the values as required. That's not the case.

Instead, SpecFlow creates 1 of 4 required step definitions:

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

And to get the remaining 3 to 'work' I need to manually write methods explicitly matching other values in the table.

I've since realised that I can just say:

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

And I get:

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

Perfect.

But all documentation seems to suggest I don't need "" and that should just work (e.g. https://github.com/cucumber/cucumber/wiki/Scenario-outlines). I note:

"Your step definitions will never have to match a placeholder. They will need to match the values that will replace the placeholder"

I just don't really see the value of writing separate step definitions for each line of the table.

Is this nuance specific to SpecFlow?

有帮助吗?

解决方案

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

will match

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

so the documentation is fine.

The problem you experienced is that the auto generation of step text doesn't anticipate what regexs to insert without the "..." - which I guess it must be using as an indicator that you are passing interchangable strings - matchable with "(.*)", but if you don't want the quotes, you can still manually correct it just fine.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top