Как получить доступ к экземпляру класса, созданного в шаге из ловушки AfterScenario в SpecFlow? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть класс с именем "RollbackManager", он используется для добавления некоторых действий из тестов и выполнения всех действий после тестов.

Я использую SpecFlow для своих тестов, поэтому для выполнения чего-либо после тестов я использую [AfterScenario] hook.

Проблема в следующем: Я не могу заставить RollbackManagerбудьте статичны, когда я запускаю тесты параллельно!

Вопрос: как я могу получить доступ к экземпляру класса RollBackManager, который был создан в определении шага SpecFlow из ловушек?

Моя текущая структура проекта:

Базовый класс с RollbackManager:

public class StepBase : Steps
{
    public RollbackManager RollbackManager { get; } = new RollbackManager();

    protected new ScenarioContext ScenarioContext { get; set; }

    public StepBase(ScenarioContext scenarioContext)
    {
        RollbackManager = new RollbackManager();
    }
}

Пример класса определения шага:

[Binding]
public sealed class ThenExport : StepBase
{
    public ThenExport(ScenarioContext scenarioContext) : base(scenarioContext)
    {
    }

    [Then(@"export status should contain entities: ""(.*)""")]
    public void ThenExportStatusShouldContain(List<String> commaSeparatedList)
    { 
        RollbackManager.RegisterRollback(() => Console.WriteLine());
    }
}

Мой класс с крючками:

[Binding]
public sealed class SpecFlowTestsBase 
{

    [AfterScenario]
    public void AfterScenario()
    {
        // here I need my rollbacks craeted in steps
    }
}

1 Ответ

0 голосов
/ 20 сентября 2018

Во-первых, не используйте базовый класс шага и не ставьте в него зацепки.Затем ваши хуки будут выполняться несколько раз.

Теперь к вашему реальному вопросу:

Чтобы разделить состояние между классами шагов, вы можете использовать контекстную инъекцию SpecFlow.
Каждый экземпляркласс привязки получит тот же экземпляр класса TestState.

Он работает следующим образом:

public class TestState
{
    public RollbackManager RollbackManager { get; } = new RollbackManager();
}

[Binding]
public sealed class ThenExport 
{
    private TestState _testState;

    public ThenExport(TestState testState)
    {
        _testState = testState;
    }

    [Then(@"export status should contain entities: ""(.*)""")]
    public void ThenExportStatusShouldContain(List<String> commaSeparatedList)
    { 
        _testState.RollbackManager.RegisterRollback(() => Console.WriteLine());
    }
}

[Binding]
public sealed class Hooks
{
    private TestState _testState;

    public ThenExport(TestState testState)
    {
        _testState = testState;
    }

    [AfterScenario]
    public void AfterScenario()
    {
        _testState.RollBackManager.DoYourStuff();
    }
}

Дополнительную документацию можно найти здесь:
https://specflow.org/documentation/Sharing-Data-between-Bindings/ https://specflow.org/documentation/Context-Injection/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...