11

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]明确地称之为“基础”方法——但这似乎有点像大锤方法......

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

4

3 回答 3

7

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

但是您可以使用其他一些钩子,例如 BeforeFeature 并且可以通过这种方式绕过它。

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

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

我希望你觉得这很有帮助

于 2012-07-26T18:42:13.600 回答
4

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

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

在 [BeforeScenario] 方法的末尾。它在 Marcus 已经链接到的页面上进行了描述:SpecFlow Hooks

于 2012-12-06T10:22:35.147 回答
2

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

The step binding attributes have an optional order property which allows you to specify the order of the hooks. Smaller numbers will be processed first and the default order value is 10,000.

于 2015-06-16T15:06:08.620 回答