Specflow测试步骤中的继承会导致不明确的步骤

时间:2017-09-18 21:04:23

标签: c# inheritance specflow

我已经读过使用Specflow时无法使用继承,这在大多数情况下都是有意义的。但是,我遇到了似乎需要正确使用继承的情况。这是我的课程:

基类

public class StepBaseClass
{
    protected readonly ScenarioContext scenarioContext;

    public StepBaseClass(ScenarioContext scenarioContext)
    {
        this.scenarioContext = scenarioContext;
    }
}

第一个继承的类:

    [Binding]
    public class StudioEnterpriseImportConnectorSteps:StepBaseClass
    {
        public StudioEnterpriseImportConnectorSteps(ScenarioContext scenarioContext) :base(scenarioContext)
        {

        }
        [Given(@"I have a data record that I want to send to the import service")]
        public void GivenIHaveADataRecordThatIWantToSendToTheImportService()
        {
            scenarioContext.Pending();
        }

        [When(@"I send the information to an invalid URL")]
        public void WhenISendTheInformationToAnInvalidURL()
        {
            scenarioContext.Pending();
        }

        [Then(@"an error should be generated")]
        public void ThenAnErrorShouldBeGenerated()
        {
            scenarioContext.Pending();
        }
    }

第二个继承的课程:

    [Binding]
    public class SitemapSteps:StepBaseClass
    {
        public SitemapSteps(ScenarioContext scenarioContext):base(scenarioContext)
        {
        }
        [When(@"I visit the URL (.*)")]
        public void WhenIVisitTheSitemapURL(string URL)
        {
            scenarioContext.Add("result", TestUtilities.GetResponseCode(URL));
            scenarioContext.Add("response", TestUtilities.GetResponseBody(URL));
        }

        [Then(@"the response code should be (.*)")]
        public void ThenTheResponseCodeShouldBe(string responseCode)
        {
            HttpStatusCode result = scenarioContext.Get<HttpStatusCode>("result");
            Assert.Equal(responseCode, result.ToString());
        }
    }

正如您所看到的,我唯一继承的是scenarioContext,这是我编写多线程测试时需要做的事情。因此,我希望能够从基类继承,而不是为每个类重复这段代码。初始化该变量的正确方法是什么,以便我可以在每个派生类中使用它?

2 个答案:

答案 0 :(得分:1)

正确的方法一如既往地取决于您的个人情况。 我建议不要使用基类并在任何地方使用上下文注入。在构造函数中重复的少量代码是一个很小的代价,可以很好地分离和拆分绑定及其实现。

要获得有关此主题的更多信息,Gaspar Nagy写了一篇关于SpecFlow中步骤基类的优缺点的博客文章: http://gasparnagy.com/2017/02/specflow-tips-baseclass-or-context-injection/

答案 1 :(得分:0)

在Specflow Test挂钩中初始化我的依赖注入之后,我会有一个名为ApplicationContext的类,它带有一个静态解析方法,它会返回我的ScenarioContext实例,如下所示:

public class ApplicationContext
{
    public static T Resolve<T>() where T: class 
    {
        return container.GetInstance<T>();
    }
}

然后在我的步骤课程中,我会像这样解决ScenarioContext

scenarioContext = (ScenarioContext)ApplicationContext.Resolve<IScenarioContext>();