我正熟悉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]
方法 - 但这看起来有点像大锤方法......
有什么想法吗?思考?指针?
答案 0 :(得分:7)
我很确定您可以(也可能不应该)订购场景的执行顺序。
但你可以使用其他一些hooks,例如BeforeFeature,也许可以这样绕过它。
另一种方法是简单地有一个标志,检查是否已在特定的东西中设置了常规内容,调用SetupDbContext方法(或者最好是SetupDbContext依次调用的东西)。
使用ScenarioContext.Current字典存储标记。
我希望你找到这个有用的
答案 1 :(得分:4)
我遇到了同样的问题。我最终使用
if(ScenarioContext.Current.ScenarioInfo.Tags.Contains("needs_extra_setup"))
答案 2 :(得分:1)
现在可以在spec2的v2中使用,这在编写本文时处于测试阶段。
步骤绑定属性具有可选的顺序属性,允许您指定挂钩的顺序。将首先处理较小的数字,默认订单值为10,000。