Specflow test step inheritance causes “Ambiguous step definitions”

天涯浪子 提交于 2019-12-05 00:37:35

Just figuring this out now myself, so a couple of notes (hopefully somebody can use this in the future):

  • Don't include the [Binding] attribute on the base class
  • Create a derived class for each feature file
    • Add the [Binding] attribute to the derived class (will automatically include all step definitions in the base class)
    • Add a [Scope] attribute to the derived class; specify the name of the feature for the named parameter Feature

The answer is simple; Don't use inheritance to define your bindings.

At run time SpecFlow finds its methods to call by scanning globally across all public classes looking for methods with matching [Given] attributes. This means that you can't have two different implementations for the same Given there is a customer statement, which if you think about it is quite a sensible design decision that will reduce ambiguity.

This worked well for me :

public class BaseSteps
{
    [Given(@"Method called")]
    public virtual void WhenMethodCalled()
    {

    }
}    



[Binding]
[Scope(Feature= "specific_feature")
public class DerivedSteps : BaseSteps
{
    [Given(@"Method called")]
    [Scope(Feature= "specific_feature", Tag ="specific_tag")]
    public override void WhenMethodCalled()
    {

    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!