2011-03-28 32 views
9

我有两个类(A和B)都标有[绑定]。目前我正在使用每个功能的类。类A和B都具有一个步骤,看起来像这样:SpecFlow - 步骤(给定)在不同的类中具有相同的正则表达式不能独立执行

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

当运行在类A中定义的特征的情况下,和测试运行执行上述指示的步骤中,类B的匹配步骤得到改为执行。

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

另外,我是否可能会滥用SpecFlow,希望每个“给定”是独立的,如果我把它们放在单独的类中?

回答

13

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

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

但有一个称为作用域步骤的功能可以解决您的这个问题。点击此处查看:https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ScopedSteps/ScopedSteps.feature

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

[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。你可以范围的步骤是:

  • 标签
  • 场景标题
  • 功能标题

大问题!我还没有完全明白那是什么,直到现在;)

+0

非常好,我今天早上和SpecFlow一起工作,发现了这个问题,并且认为我今天晚些时候需要答案 - 我这么做了。 – cfeduke 2011-03-28 21:07:13

+0

所以我想如果我的问题是试图组织我正在做的类(按功能)的步骤,那么更合适的组织将通过行为。通过这种方式,一系列行为可以逐渐构建并在稍后重新引用。不知道是否有类似TestDox的SpecFlow工具? – SideFX 2011-03-29 00:14:27

+0

是的,您可能最好为每个逻辑实体组织您的步骤定义(或更好的放置行为)。我已经创建了一个例子,你可能会觉得有用。看看这里:http://www.marcusoft.net/2011/01/kanbanboards-part-iitwo-step-forward.html?m=0 – 2011-03-29 08:55:08

相关问题