在同一解决方案的另一个项目中重复使用 SpecFlow 步骤

Reuse SpecFlow steps in another project in the same solution

重用 SpecFlow Given/When/Then 步骤的最佳方法是什么?我想出了三种方法,各有优缺点,但我不认为这是最好的方法。

我在一个解决方案中有两个项目
项目 A:

[Binding]
public class BookSteps : StepsBase
{
    [Given(@"the following books:")]
    public void GivenTheFollowingBooks(Table table)
    { 
        // ...
    }
}
  1. 我可以像这样继承我的步骤:

ProjectB:

[Binding]
public class BookStepsReference : ProjectA.BookSteps { }

这行得通并且需要最少的工作。不幸的是,它破坏了功能文件的智能感知:这些步骤在 ProjectB 功能文件中保持紫色。

  1. 我可以继承并创建具有相同签名的方法:

ProjectB:

[Binding]
public class BookStepsReference : ProjectA.BookSteps 
{ 
    [Given(@"the following books:")]
    public void GivenTheFollowingBooksReference(Table table)
    { 
        base.GivenTheFollowingBooks(table);
    }
}

当我尝试 运行 测试时,这会中断,因为自动生成的特征步骤会看到两个具有 Given 属性的方法 "the following books:" 并抛出一个不明确的引用异常。

  1. 我创建了一个引用项目 A 中的绑定步骤的私有对象:

ProjectB:

[Binding]
public class BookStepsReference
{ 
    private ProjectA.BookSteps _bookSteps = new ProjectA.BookSteps();

    [Given(@"the following books:")]
    public void GivenTheFollowingBooks(Table table)
    { 
        _bookSteps.GivenTheFollowingBooks(table);
    }
}

这有效并且还在功能文件步骤上应用了正确的智能感知。但是当我想调试我的步骤时,我在初始化 _baseSteps 对象时遇到外部 COM 异常,这可能是由看到双 Binding 属性的 SpecFlow 库引起的。

最后一个选项是我现在的工作方式,但我想知道其他人是否创建了更好的方法来重用其他项目的步骤。

支持的方法是添加对项目的引用,其中包含要重复使用的步骤到要使用的项目中,然后在配置中 define an external step assembly,如下所示:

<specFlow>
   <stepAssemblies>
     <stepAssembly assembly="MyAssembly.Name" />
   </stepAssemblies>
</specFlow>

如果您只需要重复使用一些步骤,那么您可能需要先将这些步骤提取到一个单独的库中。

当您将 step Assembly(见下文)添加到配置时,intellisense 无法看到来自 stepAssembly 的步骤。 请参阅 here 如何删除 specFlow 缓存并允许此问题。

如果您使用的是 Specflow 3,这是更新后的 link https://docs.specflow.org/projects/specflow/en/latest/Bindings/Use-Bindings-from-External-Assemblies.html

specflow.json 例子:

{
  "stepAssemblies": [
    {
      "assembly": "MySharedBindings"
    }
  ]
}

app.config 例子:

<specFlow>
  <stepAssemblies>
    <stepAssembly assembly="MySharedBindings" />
  </stepAssemblies>
</specFlow>