【发布时间】:2016-11-02 18:17:51
【问题描述】:
所以在我的工作中,我们有一个核心 SpecFlow 库,我们的不同团队可以使用它来实现自动化。这个库有一些声明的步骤。
例如,图书馆可能有这样的东西:
When I click the button
但是,假设我想定义自己的步骤声明,该声明使用完全相同的措辞。是否可以覆盖它?
【问题讨论】:
标签: c# selenium-webdriver cucumber specflow gherkin
所以在我的工作中,我们有一个核心 SpecFlow 库,我们的不同团队可以使用它来实现自动化。这个库有一些声明的步骤。
例如,图书馆可能有这样的东西:
When I click the button
但是,假设我想定义自己的步骤声明,该声明使用完全相同的措辞。是否可以覆盖它?
【问题讨论】:
标签: c# selenium-webdriver cucumber specflow gherkin
正如@Grasshopper 所写,步骤定义是全局的。
但您可以使用 Scopes 覆盖它。
见http://www.specflow.org/documentation/Scoped-Bindings/
在这种情况下,不要忘记在每个场景中指定标签或原始步骤定义将被调用。
【讨论】:
这样做是一个非常糟糕的主意,因为使用此步骤并失败的任何场景都将非常难以理解和调试。
一般来说,在场景中使用通用库步骤也不是一个好主意。场景不应包含通用步骤或对如何完成事情的描述。相反,它们应该包含特定于您的业务环境的步骤,这些步骤应该描述正在做什么以及为什么这样做。
所以不是
When I click on sign in
And I fill in my email with ...
...
我们得到了更简单、更抽象的东西
When I sign in
这完全是关于我们正在做什么,而不是关于我们如何做。
【讨论】:
如果您在同一个步骤定义文件或另一个文件中有两次相同的步骤(在您的情况下 - 当我单击按钮时),您将收到 DuplicateStepException。即使您使用给定或 then 注释。这是因为步骤定义是全局加载的,因此会导致冲突。
您也不能扩展包含文件的 stepdefinition 或钩子,因为 cucumber 会抛出一个错误,这是不可接受的。因此,您无法通过继承覆盖行为。
您将需要一起编写不同的步骤,或者如果可能的话,将按钮作为参数传递给现有步骤并在允许修改库代码的情况下放入逻辑。
【讨论】: