使用带有SpecFlow绑定的泛型类

时间:2013-11-11 22:15:22

标签: c# specflow gherkin

我正在尝试重用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()
    {
        ...
    }
    ...
}

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

1 个答案:

答案 0 :(得分:1)

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

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

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

编辑:

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

1)您的步骤过于通用,可能不应该共享。 举个例子,如果你沿着'当我提交表单'时采取了一个步骤,那么这可能太模糊了 - 哪种形式?你怎么提交的?根据您正在与之交互的页面/控件,这可能会有所不同。不要在不同的表单中重复使用该步骤,更好的方法可能是在您的步骤中更明确 - “当我提交销售表单时”。你有更多的步骤,但你没有遇到你正在努力解决的重复使用问题。

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

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