问题 SpecFlow - 多个BeforeScenario方法的排序


我正在使用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] 像在overriden方法中调用基本方法的方法?

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

有任何想法吗?思考?指针吗?


13080
2017-07-26 08:12


起源



答案:


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

但你可以使用其他一些 挂钩 比如BeforeFeature,也许就这样绕过它。

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

使用 ScenarioContext.Current 字典来存储你的旗帜。

我希望你发现这很有帮助


7
2017-07-26 18:42



您还可以使用FeatureContext.Current与BeforeFeature一起使用 - Heliac


答案:


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

但你可以使用其他一些 挂钩 比如BeforeFeature,也许就这样绕过它。

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

使用 ScenarioContext.Current 字典来存储你的旗帜。

我希望你发现这很有帮助


7
2017-07-26 18:42



您还可以使用FeatureContext.Current与BeforeFeature一起使用 - Heliac


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

if(ScenarioContext.Current.ScenarioInfo.Tags.Contains("needs_extra_setup"))

在[BeforeScenario]方法的最后。 它已在Marcus链接的页面上描述: SpecFlow Hooks


4
2017-12-06 10:22



谢谢你!正在寻找区分Web(即Selenium)和非Web验收测试的方法,Hooks文档给了我我需要的确切内容:) - Henry Wilson


现在可以在v2的specflow中进行,这在编写本文时处于测试阶段。

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


1
2018-06-16 15:06



谢谢! - [Order] 确实进入了 最终版本 - StuartLC