【问题标题】:SpecFlow - ordering of multiple BeforeScenario methodsSpecFlow - 多个 BeforeScenario 方法的排序
【发布时间】:2015-06-16 23:06:08
【问题描述】:

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] 方法 - 但这似乎有点像大锤方法.....

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

【问题讨论】:

    标签: testing specflow


    【解决方案1】:

    我很确定您可以(并且可能不应该)对场景的执行顺序进行排序。

    但是您可以使用其他一些hooks,例如 BeforeFeature,也许可以通过这种方式绕过它。

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

    使用ScenarioContext.Current 字典来存储您的标志。

    希望对您有所帮助

    【讨论】:

    • 您也可以使用 FeatureContext.Current 与 BeforeFeature 一起使用
    【解决方案2】:

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

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

    在 [BeforeScenario] 方法的末尾。 马库斯已经链接到的页面上对此进行了描述:SpecFlow Hooks

    【讨论】:

    • 谢谢!正在寻找一种区分 Web(即 Selenium)和非 Web 验收测试的方法,Hooks 文档正是我所需要的 :)
    【解决方案3】:

    现在可以在 specflow 的 v2 中实现这一点,在撰写本文时它还处于测试阶段。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2023-03-15
    • 2021-08-03
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 2014-04-16
    相关资源
    最近更新 更多