SpecFlow looking for When instead of Given step
When writing some automation tests using Selenium with SpecFlow recently I was faced with an odd error:
    No matching step definition found for the step. Use the following code to create one:
    [When(@"I add a new dog")]
    public void WhenIAddANewDog()
    {
        ScenarioContext.Current.Pending();
    }
The suggested code was using a [When("My Scenario")] step despite the feature file declaring it as a Given:
Scenario: Check for existing dog
    Given I have a new Dog Controller
    And I add a new dog
    When I check if the added dog exists
    Then The check is true
(This feature is written badly to illustrate the error).
The step it couldn't find was the And I add a new dog step. Despite showing as bound in the feature file and being able to navigate to the step definition, the running test couldn't find it and was looking for a When instead of a Given.
This is because the previous step was calling sub steps as follows:
public class DogControllerSteps : Steps
{
    [Given("I have a new Dog Controller")]
    public void CreateDogController()
    {
        Given("I have a new query bus");
        When("I create a new dog controller");
    }
}
Inheriting from Steps allows us to reuse step definitions from the same or other step files.
When SpecFlow runs this it knows that it last ran a When step, despite being in the definition of a Given. Therefore when the next step is defined with And, it looks for a When. To fix this you can simply change your feature to be more specific:
Scenario: Check for existing dog
    Given I have a new Dog Controller
    Given I add a new dog
    When I check if the added dog exists
    Then The check is true
Passing tests :)