在同一解决方案的另一个项目中重复使用 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)
{
// ...
}
}
- 我可以像这样继承我的步骤:
ProjectB:
[Binding]
public class BookStepsReference : ProjectA.BookSteps { }
这行得通并且需要最少的工作。不幸的是,它破坏了功能文件的智能感知:这些步骤在 ProjectB 功能文件中保持紫色。
- 我可以继承并创建具有相同签名的方法:
ProjectB:
[Binding]
public class BookStepsReference : ProjectA.BookSteps
{
[Given(@"the following books:")]
public void GivenTheFollowingBooksReference(Table table)
{
base.GivenTheFollowingBooks(table);
}
}
当我尝试 运行 测试时,这会中断,因为自动生成的特征步骤会看到两个具有 Given 属性的方法 "the following books:" 并抛出一个不明确的引用异常。
- 我创建了一个引用项目 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>
重用 SpecFlow Given/When/Then 步骤的最佳方法是什么?我想出了三种方法,各有优缺点,但我不认为这是最好的方法。
我在一个解决方案中有两个项目
项目 A:
[Binding]
public class BookSteps : StepsBase
{
[Given(@"the following books:")]
public void GivenTheFollowingBooks(Table table)
{
// ...
}
}
- 我可以像这样继承我的步骤:
ProjectB:
[Binding]
public class BookStepsReference : ProjectA.BookSteps { }
这行得通并且需要最少的工作。不幸的是,它破坏了功能文件的智能感知:这些步骤在 ProjectB 功能文件中保持紫色。
- 我可以继承并创建具有相同签名的方法:
ProjectB:
[Binding]
public class BookStepsReference : ProjectA.BookSteps
{
[Given(@"the following books:")]
public void GivenTheFollowingBooksReference(Table table)
{
base.GivenTheFollowingBooks(table);
}
}
当我尝试 运行 测试时,这会中断,因为自动生成的特征步骤会看到两个具有 Given 属性的方法 "the following books:" 并抛出一个不明确的引用异常。
- 我创建了一个引用项目 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>