3

我正在尝试重用 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]”属性来解决,但我的基类是通用的,添加此属性会导致运行时异常。有没有解决这个问题的干净方法?

4

1 回答 1

1

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

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

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

编辑:

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

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

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

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

于 2013-11-12T03:55:02.287 回答