Замените ScenarioContext.Current в не связывающем классе, используя внедрение контекста - PullRequest
1 голос
/ 10 июня 2019

Я хочу использовать контекстное внедрение, чтобы удалить устаревшие предупреждения для FeatureContext.Current и ScenarioContext.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 всегда возвращает ноль. Я надеялся, что он получит текущий контекст объекта, чтобы я мог использовать его, чтобы получить заголовок и использовать его в других частях класса отчетов.

У меня та же проблема с _scenariocontext.

1 Ответ

0 голосов
/ 10 июня 2019

Основная проблема заключается в том, что для объекта Reporter требуется объект FeatureContext и ScenarioContext.Когда выполняется хук [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, чтобы он принимал аргумент FeatureContext в ReportFeature:

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 станет еще проще без необходимости вызывать статический "Метод init "в классе Reporter:

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

См. Статические конструкторы (Руководство по программированию в C #)

...