使用上下文注入替换非绑定类中的ScenarioContext.Current

时间:2019-06-10 15:56:46

标签: c# specflow scenarios obsolete

我想使用上下文注入来删除FeatureContext.CurrentScenarioContext.Current我的代码的过时警告。

我有一个非绑定类的报告程序,需要在运行测试之前进行设置。

我尝试制作一个构造函数并将其实例化,但是值始终返回Null。

在设置步骤

namespace EclipseWebAutomationV2.Steps
{
    [Binding]
    class StepSetup
    {

        public static FeatureContext _featurecontext;
        public static ScenarioContext _scenariocontext;


        [BeforeTestRun]
        public static void InitializeReport()
        {
            Reporter.ReportInit();
        }

        [BeforeFeature]
        public static void BeforeFeature()
        {
            Reporter bfeature = new Reporter(_featurecontext, _scenariocontext);
            bfeature.ReportFeature();
        }
    }
}

在报告类中:

namespace EclipseWebAutomationV2.Configurations
{
    class Reporter
    {



        private readonly FeatureContext _featurecontext;
        private readonly ScenarioContext _scenariocontext;
        public Reporter(FeatureContext _featurecontext, ScenarioContext _scenariocontext)
        {
            this._featurecontext = _featurecontext;
            this._scenariocontext = _scenariocontext;
        }

        public static void ReportInit()
        {
            //does stuff
        }


        public void ReportFeature()
        {
            featureName = extent.CreateTest<Feature>(_featurecontext.FeatureInfo.Title);
        }
    }
}

_featurecontext始终返回null。我希望它能够获取当前的要素上下文,以便可以使用它来获取标题并将其用于报告类的其他部分。

我在_scenariocontext中遇到相同的问题。

1 个答案:

答案 0 :(得分:0)

主要问题是Reporter对象需要一个FeatureContextScenarioContext对象。执行[BeforeFeature]挂钩时,ScenarioContext还不存在。

[BeforeFeature]挂钩支持几个重载,其中一个重载接受新创建的FeatureContext作为参数。

这与删除FeatureContext和ScenarioContext对象作为Reporter类的依赖项相结合,将解决您的问题。

首先,更改StepSetup类以删除对FeatureContext和ScenarioContext的依赖性,并更改[BeforeFeature]以接受FeatureContext对象作为参数:

[Binding]
class StepSetup
{
    [BeforeTestRun]
    public static void InitializeReport()
    {
        Reporter.ReportInit();
    }

    [BeforeFeature]
    public static void BeforeFeature(FeatureContext featureContext)
    {
        var reporter = new Reporter();

        reporter.ReportFeature(featureContext);
    }
}

然后将Reporter类更改为在ReportFeature中接受FeatureContext参数:

class Reporter
{
    public static ReportInit()
    {
        // does stuff
    }

    public void ReportFeature(FeatureContext featureContext)
    {
        featureName = extent.CreateTest<Feature>(featureContext.FeatureInfo.Title);
    }
}

如果Reporter.ReportFeature方法不使用任何实例字段,请考虑同时使该方法成为静态方法,并使用静态构造函数代替Reporter.ReportInit()方法:

static class Reporter
{
    static Reporter()
    {
        // does stuff
    }

    public static void ReportFeature(FeatureContext featureContext)
    {
        featureName = extent.CreateTest<Feature>(featureContext.FeatureInfo.Title);
    }
}

然后,您的StepSetup类变得更加简单,无需在Reporter类上调用静态的“ init”方法:

[Binding]
class StepSetup
{
    [BeforeFeature]
    public static void BeforeFeature(FeatureContext featureContext)
    {
        Reporter.ReportFeature(featureContext);
    }
}

请参见Static Constructors (C# Programming Guide)