I recently discovered something rather nice in SpecFlow, I was implementing a scenario like this
Scenario: Save a user Given I have a user with the name Joe Bloggs When I save them Then the user should have a FirstName Joe And the user should have a LastName of Bloggs
I wanted to provide the flexibility in the assertions so our QA could decide how he wanted to phrase the text in the scenario. Logically however we’d want the same binding for each variation.
Here’s what I came up with:
[Then(@"the user should have a (.*) (.*)")] [Then(@"the user should have a (.*) of (.*)")] public void ThenTheUserShouldHaveA(string field, string value) { var user = GetUser(); Assert.AreEqual(user.Properties[field], value); }
However this didn’t work, I kept getting a field of “FirstName of”. I discovered however that you can reverse the binding attributes to give priority.
Updating the attributes to
[Then(@"the user should have a (.*) of (.*)")] [Then(@"the user should have a (.*) (.*)")]
This change gave the of binding precedence and ensured that both scenario steps worked correctly.