In SpecFlow how can I share data between steps/features?
I have a helper class which lets me write
Current<Page>.Value = pageObject;
which is a wrapper over the ScenarioContext. It works off the type name, so it would need to be extended a bit if you need to access two variables of the same type
public static class Current<T> where T : class
{
internal static T Value
{
get {
return ScenarioContext.Current.ContainsKey(typeof(T).FullName)
? ScenarioContext.Current[typeof(T).FullName] as T : null;
}
set { ScenarioContext.Current[typeof(T).FullName] = value; }
}
}
2019 edit: I would use @JoeT's answer nowadays, it looks like you get the same benefits without needing to define an extension
In SpecFlow 1.3 there are three methods:
- static members
- ScenarioContext
- ContextInjection
Comments:
static members are very pragmatic and in this case not so evil as we as developers might first think (there is no threading or need for mocking/replacing in step-definitions)
See answer from @Si Keep in this thread
If the constructor of a step definition class needs arguments, Specflow tries to inject these arguments. This can be used to inject the same context into several step-definitions.
See an example here: https://docs.specflow.org/projects/specflow/en/latest/Bindings/Context-Injection.html
Use the ScenarioContext class which is a dictionary that is common to all the steps.
ScenarioContext.Current.Add("ActionResult", actionResult);
var actionResult = (ActionResult) ScenarioContext.Current["ActionResult"];