Sometimes we need one step definition to know about parameter data that was passed to previous steps.
There’s 3 ways main ways to do this, each with various considerations.
Private Field in Binding Class
This is the simplest approach. Simply add a private field to your [Binding] class containing your step definitions.
In a step, just grab the parameter data and store it in this private field.
In later steps, retrieve the data from this private field.
This approach is simple but breaks down when we start to refactor our step definitions into multiple step definition classes; the private field data is not accessible between steps in different binding classes.
We can store data for the current executing scenario using the ScenarioContext class.
There's a number of ways to use it, but essentially it’s a dictionary that we can store arbitrary data and retrieve it by a key:
ScenarioContext.Current["age"] = 42;
This approach can be used even if we refactor step definitions out across multiple binding classes. The scenario context is shared between all steps for the lifetime that a scenario is executing.
This approach can start to get a little ugly, we also have to make sure our dictionary keys are correct in all the steps where we set or retrieve data.
By default, it’s also weakly-typed – the dictionary just stores objects so we can end up with casts every time we retrieve data.
The third method (which I wrote about previously) lets us take a dependency injection style approach, and define POCOs to represent the data (in a strongly typed way) that automatically gets injected into each of our binding classes.
Like ScenarioContext, this approach also works across multiple binding classes. Unlike ScenarioContext, we don’t have to worry about dictionary keys or casting.
If you’re new to SpecFlow and Gherkin, check out my Pluralsight course: Automated Acceptance Testing with SpecFlow and Gherkin or if you understand the basics or have been using it for a while, check out SpecFlow Tips and Tricks course to learn how to create more maintainable SpecFlow test automation solutions.