One nice aspect of SpecFlow is the ability to scope bindings by feature title, scenario title, or tag. Normally bindings are global to the project, but a binding's scope can be restricted using the
Scope attribute. I like to think of it as similar to the
public class modifiers in C#.
Consider the Gherkin below.
It is a single feature with one scenario and two tags. One tag is at the feature level and the other at the scenario level.
The feature's corresponding steps can be scoped by:
In these snippets, the
Scope attribute is applied at the class level, but you can also put them on individual methods. When the SpecFlow test runner executes the bindings, it will match the Gherkin to methods based on scoping rules. If there are multiple matches, the most restrictive match is used.
Same Gherkin, Different Bindings
To illustrate the usefulness of scoped bindings, consider the following feature that invokes a service with content serialized to XML, JSON, and Form-UrlEncoding. The text of the
When step is the same in the Gherkin for all three scenarios, but each bound method is different. Without scoped bindings, this feature won't run because the SpecFlow runtime can't determine which method to execute.
Scoped bindings can help. You could scope each method by scenario title.
Or use tags.
While this example works well for demonstrating the power of scoped bindings, I generally avoid coupling step definitions to Gherkin in all but the simplest features. In fact, this type of coupling has been identified as an anti-pattern.