Cucumber SpecFlow——步骤(给定)在不同的类中使用相同的正则表达式,而不是独立执行

Cucumber SpecFlow——步骤(给定)在不同的类中使用相同的正则表达式,而不是独立执行,cucumber,specflow,gherkin,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中定义的特性运行场景,并且测试运行程序执行上述

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

   [Given(@"an employee (.*) (.*) is a (.*) at (.*)")]
   public void GivenAnEmployeeIsAAt(string firstName, string lastName, string role, string businessUnitName)
当我为类A中定义的特性运行场景,并且测试运行程序执行上述步骤时,将执行类B中的匹配步骤

“步骤”也是全球性的吗?我认为只有“钩子”方法是全局的,即场景前、场景后。我不希望“给定”、“然后”和“何时”出现这种行为。有办法解决这个问题吗?我尝试将这两个类放在不同的名称空间中,但这也不起作用

此外,如果我将每个“给定”放在单独的类中,我是否希望它们是独立的,从而有可能误用SpecFlow?

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

处于不同的类或其他位置(甚至是其他程序集)与SpecFlow如何对其进行分组没有任何关系-它只是一个大列表,列出了它试图与步骤匹配的给定的、时间的、然后的

但是有一个叫做作用域步骤的特性可以为您解决这个问题。在这里查看:

我们的想法是,在步骤定义方法上添加另一个属性(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用于标记。您可以通过以下方式确定步骤的范围:

  • 标签
  • 场景标题
  • 专题标题

好问题!直到现在我才完全明白那是为了什么;)

很好,今天早上我在使用SpecFlow,发现了这个问题,我想今天晚些时候我需要答案——我已经找到了。所以我想如果我的问题是试图组织步骤,我现在在课堂上做的是(按功能),那么更合适的组织应该是按行为。通过这种方式,可以逐步构建行为集合,并在以后引用以供重用。想知道是否有一个类似TestDox的工具用于SpecFlow?是的,您最好按照逻辑实体组织步骤定义(或者更好地组织放置行为)。我创建了一个这样的示例,您可能会发现它很有用。在这里查看:自从最初发布答案以来,链接和语法已经发生了一些变化。新链接是,它显示了新语法。