将泛型类与 SpecFlow 绑定一起使用



我正在尝试重用SpecFlow步骤来测试两个类似的UI组件。目前,我的解决方案有一个包含共享步骤的通用基类和两个包含所有剩余步骤的子类,如下所示:

[Binding]
public class ChildSteps1 : BaseSteps<MyType1>
{
    ...
    [When(@"I do action one")]
    public void WhenIDoActionOne()
    {
        ...
    }
    ...
}
public class BaseSteps<T>
    where T : ...
{
    ...
    [When(@"I do action two")]
    public void WhenIDoActionTwo()
    {
        ...
    }
    ...
}

我遇到的问题是通用类中的步骤(例如本例中的"操作二")没有突出显示或可从 .feature 文件导航(文本是紫色的,我无法通过按 F12 跳转到定义)。通常这可以通过将"[Binding]"属性添加到基类来解决,但我的基类是通用的,添加此属性将导致运行时异常。这个问题有干净的补救措施吗?

如果您只是尝试将常见的步骤定义分组到单个类(或程序集或其他任何类)中,则无需使用基类。将您的步骤放在具有 [Binding] 属性的标准类中就足够了 - SpecFlow 将选取这些步骤并允许从 .feature 文件进行导航。

如果此类在另一个程序集中,那么您可以通过编辑配置文件来告诉 SpecFlow 查找位置 - 请参阅此处的<stepAssemblies>条目:http://www.specflow.org/documentation/Configuration/

如果这不能回答你的问题,正如 Fresh 在他的评论中问的那样,如果你解释为什么需要使用泛型基类可能会有所帮助。

编辑:

根据您的评论,我可以想到我的答案有两个可能的补充:

1)你的步骤太通用了,可能不应该分享。举个例子,如果你有一个"当我提交表格时"的步骤,那么这可能太模糊了——哪个表格?你如何提交它?这可能会有所不同,具体取决于您与之交互的页面/控件。更好的方法可能是在步骤中更明确地说明"当我提交销售表单时",而不是对不同的表单重复使用该步骤。您有更多的步骤,但您没有您正在努力解决的重用问题。

2)也许将标签与场景/功能上下文结合使用就是答案。您说您正在使用泛型基类来决定使用哪些驱动程序类。获取此行为的另一种方法是使用 [BeforeFeature][BeforeScenario]设置方法,检查特定标记是否存在,然后将特定驱动程序注入上下文。您的步骤(不再需要任何基类或泛型)可以从上下文中获取驱动程序并调用相应的方法。

有关详细信息,请参阅 http://www.specflow.org/documentation/ScenarioContext.Current/。

相关内容

最新更新