SpecFlow hooks allow additional code to be executed before and after various stages of the test execution lifecycle, for example running additional setup code before each scenario executes.
If there are multiple of the same type of hook specified, by default the execution order of the hook methods is unspecified. For example the following code has three [BeforeStep] hook methods that could be executed in any order before every step of the scenario executes:
[BeforeStep]
public void BeforeHook1()
{
}
[BeforeStep]
public void BeforeHook2()
{
}
[BeforeStep]
public void BeforeHook3()
{
}
To ensure these hook methods are executed in a specified order, the hook attributes allow an optional order to be specified. When there are multiple of the same hook methods defined, the lowest order values execute before the higher order methods:
[BeforeStep(Order = 100)]
public void BeforeHook1()
{
}
[BeforeStep(Order = 200)]
public void BeforeHook2()
{
}
[BeforeStep(Order = 300)]
public void BeforeHook3()
{
}
The values of the Order property are arbitrary, you may use whatever values you wish, though it is sensible to allow some “wriggle room” for future additional steps by working in increments of 10 or 100 for example.
The following code illustrates another example where the execution order of hooks is important; the database should be reset first before test users are added:
[Binding]
public class Hooks
{
[BeforeScenario(Order = 100)]
public void ResetDatabase()
{
}
[BeforeScenario(Order = 200)]
public void AddTestUsersToDatabase()
{
}
}
To see hook ordering in action, check out my Pluralsight course: Business Readable Automated Tests with SpecFlow 2.0.
You can start watching with a Pluralsight free trial.
SHARE: