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

时间:2015-03-30 15:00:53

标签: c# visual-studio-2012 specflow

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

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

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

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

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

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

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

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

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

        ProjectB:

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

        这样可以在Feature File步骤中应用正确的intellisense。但是当我想调试我的步骤时,我在初始化_baseSteps对象时遇到外部COM异常,这可能是由看到双重绑定属性的SpecFlow库引起的。

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

2 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:2)

当你将stepAssembly(见下文)添加到config时,intellisence无法看到stepAssembly中的步骤。 请参阅here如何删除specFlow缓存并允许此问题。