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

Aut*_*aos 5 c# specflow visual-studio-2012

什么是重用SpecFlow Given/When/Then步骤的最佳方法?我找到了三种具有所有特定优点和缺点的方法,但我不相信这是最好的方法.

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

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

ProjectB:

[Binding]
public class BookStepsReference : ProjectA.BookSteps { }
Run Code Online (Sandbox Code Playgroud)

这工作并且需要最少的工作.不幸的是,它打破了功能文件的智能感知:ProjectB功能文件中的步骤保持紫色.

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

ProjectB:

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

当我尝试运行测试时,这会中断,因为自动生成的功能步骤会看到两个带有Given属性的方法"以下书籍:"并抛出一个模糊的引用异常.

  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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效,并且还在Feature File步骤中应用了正确的intellisense.但是当我想调试我的步骤时,我在初始化_baseSteps对象时遇到外部COM异常,这可能是由看到双重Binding属性的SpecFlow库引起的.

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

Sam*_*der 11

支持的方法是添加对项目的引用,该引用包含要在之后使用的项目中重用的步骤,然后在配置中定义外部步骤程序集,如下所示:

<specFlow>
   <stepAssemblies>
     <stepAssembly assembly="MyAssembly.Name" />
   </stepAssemblies>
</specFlow>
Run Code Online (Sandbox Code Playgroud)

如果您只需要重用某些步骤,则可能需要先将这些步骤提取到单独的库中.