SpecFlow - 多个BeforeScenario方法的排序

时间:2012-07-26 08:12:24

标签: testing specflow

我正熟悉SpecFlow,我真的非常喜欢它。

除了一些棘手的问题......比如功能和场景设置代码。

在一个名为InfrastructureSteps.cs的“通用”文件中,我有一些应该为每个场景运行的常规设置代码 - 所以我的方法看起来像这样:

[BeforeScenario]
public void SetupDbContext()
{
    // define some basic stuff, set up a database transaction context etc.
}

这需要在每个场景之前运行,到目前为止,它已经运行得很好。

但是现在,我在测试特定的步骤文件中有两个场景,在运行之前还需要相当广泛的设置。所以我在.feature标记了他们的情景,标记为:

@needs_extra_setup
Scenario: .....
   Given .....
   When .....
   Then ......

并实施了特定于测试的BeforeScenario设置方法:

[BeforeScenario("needs_extra_setup")]
public void DoExtraSetupForMyScenario()
{
   // do stuff
}

它有效 - 它被调用 - 但它被调用之前通用[BeforeScenario]方法被调用:-(因此它失败了 - 在通用目的中设置的东西安装方法不存在,导致我的代码失败。

那么在SpecFlow中有什么方法可以订购[BeforeScenario]方法吗?或者,我是否可以告诉特定的[BeforeScenario]方法首先执行“基础”[BeforeScenario]方法,例如在重写方法中调用基本方法?

当然我可以明确地称之为“基础”[BeforeScenario]方法 - 但这看起来有点像大锤方法......

有什么想法吗?思考?指针?

3 个答案:

答案 0 :(得分:7)

我很确定您可以(也可能不应该)订购场景的执行顺序。

但你可以使用其他一些hooks,例如BeforeFeature,也许可以这样绕过它。

另一种方法是简单地有一个标志,检查是否已在特定的东西中设置了常规内容,调用SetupDbContext方法(或者最好是SetupDbContext依次调用的东西)。

使用ScenarioContext.Current字典存储标记。

我希望你找到这个有用的

答案 1 :(得分:4)

我遇到了同样的问题。我最终使用

if(ScenarioContext.Current.ScenarioInfo.Tags.Contains("needs_extra_setup"))
。 它已在Marcus已链接的页面上进行了描述:SpecFlow Hooks

答案 2 :(得分:1)

现在可以在spec2的v2中使用,这在编写本文时处于测试阶段。

步骤绑定属性具有可选的顺序属性,允许您指定挂钩的顺序。将首先处理较小的数字,默认订单值为10,000。