Calling Steps from Step Definitions¶
Note: This feature was removed in SpecFlow 4.0. Details about it can be found here.
It is possible to call steps from within Step Definitions:
[Binding]
public class CallingStepsFromStepDefinitionSteps : Steps
{
[Given(@"the user (.*) exists")]
public void GivenTheUserExists(string name)
{
// ...
}
[Given(@"I log in as (.*)")]
public void GivenILogInAs(string name)
{
// ...
}
[Given(@"(.*) is logged in")]
public void GivenIsLoggedIn(string name)
{
Given(string.Format("the user {0} exists", name));
Given(string.Format("I log in as {0}", name));
}
}
Invoking steps from step definitions is practical if you have several common steps that you want to perform in several scenarios, or simply if you want to make your scenarios shorter and more declarative. This allows you to do the following in a Scenario:
# feature Scenario: View last incidents Given Linda is logged in # This will in fact invoke 2 step definitions When I go to the incident page
Instead of having a lot of repetition:
# feature Scenario: View last incidents Given the user Linda exists And I log in as Linda When I go to the incident page
Note: When using this approach to remove duplications from your feature files, the console output will contain both the master step and the delegated steps as follows:
Given Linda is logged in Given the user Linda exists And I log in as Linda When I go to the incident page
Calling steps with multiline step arguments¶
Sometimes you want to call a step that has been designed to take [Multiline Step Arguments](../Gherkin/Using Gherkin Language in SpecFlow.md), for example:
Tables¶
[Given(@"an expense report for (.*) with the following posts:")]
public void GivenAnExpenseReportForWithTheFollowingPosts(string date, Table postTable)
{
// ...
}
This can easily be called from a plain text step like this:
# feature Given an expense report for Jan 2009 with the following posts: | account | description | amount | | INT-100 | Taxi | 114 | | CUC-101 | Peeler | 22 |
But what if you want to call this from a step definition? There are a couple of ways to do this:
[Given(@"A simple expense report")]
public void GivenASimpleExpenseReport()
{
string[] header = {"account" , "description", "amount"};
string[] row1 = {"INT-100" , "Taxi", "114"};
string[] row2 = {"CUC-101" , "Peeler", "22"};
var t = new Table(header);
t.AddRow(row1);
t.AddRow(row2);
Given("an expense report for Jan 2009 with the following posts:", t);
}