C# 是否覆盖SpecFlow中的步骤声明?

C# 是否覆盖SpecFlow中的步骤声明?,c#,selenium-webdriver,cucumber,specflow,gherkin,C#,Selenium Webdriver,Cucumber,Specflow,Gherkin,所以在我的工作中,我们有一个核心SpecFlow库,我们的不同团队可以使用它实现自动化。此库有一些已声明的步骤 例如,库可能有如下内容: When I click the button 但是,假设我想定义自己的step声明,它使用完全相同的措辞。是否可以覆盖它?如果在同一个步骤定义文件或另一个步骤定义文件中有两次相同的步骤(在您的情况下,当我单击按钮时),您将获得DuplicateStepException。即使使用给定的or then注释。这是因为步骤定义是全局加载的,因此会导致冲突 此外,

所以在我的工作中,我们有一个核心SpecFlow库,我们的不同团队可以使用它实现自动化。此库有一些已声明的步骤

例如,库可能有如下内容:

When I click the button

但是,假设我想定义自己的step声明,它使用完全相同的措辞。是否可以覆盖它?

如果在同一个步骤定义文件或另一个步骤定义文件中有两次相同的步骤(在您的情况下,当我单击按钮时),您将获得DuplicateStepException。即使使用给定的or then注释。这是因为步骤定义是全局加载的,因此会导致冲突

此外,您不能扩展包含文件的stepdefinition或hook,因为cucumber将抛出一个错误,这是不可接受的。因此,您无法通过继承覆盖行为


您将需要一起编写不同的步骤,或者如果允许修改库代码,则可能将按钮作为参数传递给现有步骤并放入逻辑中

正如@Grasshopper所写,步骤定义是全局的。
但您可以使用作用域覆盖它。


在这种情况下,不要忘记在每个场景中指定将调用的标记或原始步骤定义。

这样做是一个非常糟糕的主意,因为任何使用此步骤但失败的场景都将很难理解和调试

一般来说,在场景中使用通用库步骤也不是一个好主意。场景不应包含一般步骤或如何完成事情的描述。相反,它们应该包含特定于您的业务上下文的步骤,这些步骤应该描述正在做什么以及为什么要做

所以不是

When I click on sign in
   And I fill in my email with ...
   ...
我们得到了更简单、更抽象的结果

 When I sign in
这都是关于我们在做什么,而不是关于我们如何做