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

Replace ScenarioContext.Current in non binding class using context injection

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

我有一个非绑定 class 的记者,需要在测试 运行 之前进行设置。

我尝试制作一个构造函数并将其实例化,但值始终 return 为 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();
        }
    }
}

在报告中class:

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 总是 return 为空。我希望它能获取当前的功能上下文,这样我就可以用它来获取标题并在报告的其他部分使用它 class。

我对 _scenariocontext 有同样的问题。

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

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

这与删除作为 Reporter 依赖项的 FeatureContext 和 ScenarioContext 对象 class 将解决您的问题。

首先,更改 StepSetup class 以删除对 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 class 以接受 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 class 变得更加简单,无需在 Reporter class:

上调用静态 "init" 方法
[Binding]
class StepSetup
{
    [BeforeFeature]
    public static void BeforeFeature(FeatureContext featureContext)
    {
        Reporter.ReportFeature(featureContext);
    }
}

Static Constructors (C# Programming Guide)