9

我有两个类(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”、“Then”和“When”出现这种行为。有没有什么办法解决这一问题?我尝试将这两个类放在不同的名称空间中,但这也不起作用。

另外,如果我将每个“Given”放在单独的类中,我是否可能会通过希望每个“Given”独立来滥用 SpecFlow?

4

1 回答 1

14

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

处于单独的类或其他位置(甚至其他程序集)与 SpecFlow 如何对其进行分组没有任何关系 - 它只是一个大列表 Given's、When's 和 Then's,它试图与 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 用于标记。您可以通过以下方式确定您的步骤:

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

好问题!直到现在我还没有完全理解那是什么;)

于 2011-03-28T19:55:46.360 回答