SpecFlow - Step(Given)在不同的类中使用相同的正则表达式而不是独立执行

时间:2011-03-28 18:14:20

标签: cucumber specflow gherkin

我有两个类(A类和B类)都标有[Binding]。目前我正在使用每个功能的类。 A类和B类都有一个如下所示的步骤:

   [Given(@"an employee (.*) (.*) is a (.*) at (.*)")]
   public void GivenAnEmployeeIsAAt(string firstName, string lastName, string role, string businessUnitName)

当我运行A类中定义的功能的场景,并且测试运行器执行上述步骤时,将执行B类中的匹配步骤。

“步骤”也是全球性的吗?我认为只有“钩子”方法是全局的,即BeforeScenario,AfterScenario。我不希望这种行为为“给定”,“然后”和“何时”。有没有什么办法解决这一问题?我尝试将这两个类放在不同的命名空间中,这也不起作用。

另外,如果我将每个“Given”放在不同的类中,我是否可能会滥用SpecFlow?

1 个答案:

答案 0 :(得分:13)

是步骤(默认情况下)全局。因此,如果定义两个具有与同一步骤匹配的RegExps的属性,则会遇到麻烦。即使他们在不同的班级。

在单独的类或其他位置(甚至是其他程序集)与SpecFlow如何对它进行分组没有任何关系 - 它只是Given的大列表,When's和Then,它尝试匹配Step。

但是有一个名为Scoped Steps的功能可以解决这个问题。请在此处查看:https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ScopedSteps/ScopedSteps.feature

这个想法是你在Step Defintion方法上放置了另一个属性(StepScope),然后它将遵循该范围。像这样举例如:

[Given(@"I have a step definition that is scoped to tag (?:.*)")]
[StepScope(Tag = "mytag")] 
public void GivenIHaveAStepDefinitionThatIsScopedWithMyTag()
{
    stepTracker.StepExecuted("Given I have a step definition that is scoped to tag 'mytag'");
}

...或将整个步骤定义类的范围限定为单个特征:

[Binding]
[StepScope(Feature = "turning on the light should make it bright")]
public class TurningOnTheLightSteps
{
    // ...
}

此步骤定义使用StepScope作为标记。您可以通过以下方式确定步骤的范围:

  • 标签
  • 情景标题
  • 专题标题

好问题!到目前为止,我还没有完全理解那是什么;)