问题
I want to have the following test step class structure:
[Binding]
public class BaseStep
{
[Given(@"there is a customer")]
public void GivenThereIsACustomer(Table table)
{
HandleCustomer(table);
}
protected virtual void HandleCustomer(Table table)
{
}
}
[Binding]
public class FeatureOneStep : BaseStep
{
protected override void HandleCustomer(Table table)
{
// feature one action
}
[Given(@"feature one specific step")]
public void GivenFeatureOneSpecificAction(Table table)
{
// do something
}
}
[Binding]
public class FeatureTwoStep : BaseStep
{
protected override void HandleCustomer(Table table)
{
// feature two action
}
[Given(@"feature two specific step")]
public void GivenFeatureTwoSpecificAction(Table table)
{
// do something
}
}
"Given there is a customer" is a common step that is used in both FeatureOne and FeatureTwo, but it will have different handling logic inside the two features. So I decide to put this step definition into a base class and override the protected methods in two derived classes respectively.
However, when I ran the tests, I have the following error:
TechTalk.SpecFlow.BindingException: Ambiguous step definitions found for step
'Given there is a customer':
CustomerTestBase.GivenThereIsACustomer(Table),
CustomerTestBase.GivenThereIsACustomer(Table)
Can any one tell me how to fix this issue?
回答1:
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
回答2:
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.
回答3:
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()
{
}
}
来源:https://stackoverflow.com/questions/25433031/specflow-test-step-inheritance-causes-ambiguous-step-definitions