Как разделить класс привязки шага в SpecFlow с внедрением контекста - PullRequest
1 голос
/ 23 октября 2019

Я использую внедрение контекста в SpecFlow, но я столкнулся с проблемой, из-за которой я хочу поделиться классом привязок шага, но мне не обязательно регистрировать все параметры конструктора.

У меня естьразличные перехватчики BeforeScenario в отдельном классе привязки / перехвата, где я регистрирую объекты в контейнере, как показано ниже ....

[Scope(Scenario = "Scenario A")]
[BeforeScenario(Order = 5)]
public void CreateApprenticeWithChecklist()
{
    //Other stuff

    _container.RegisterInstanceAs<Apprentice>(apprentice);
}

[Scope(Scenario = "Scenario B")]
[BeforeScenario(Order = 5)]
public void CreateApprenticeWithChecklistAllSignOff()
{
    //Other stuff

    _container.RegisterInstanceAs<Apprentice>(apprentice);
    _container.RegisterInstanceAs<Dictionary<string, UserDetails>>(new Dictionary<string, UserDetails>
    {
        ["Employer"] = employer.Key,
        ["Training Provider"] = trainingProvider.Key
    });
}

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

[Binding]
public sealed class ApprenticeChecklistSteps
{
    private Apprentice _apprentice;
    private UserDetails _employer;
    private UserDetails _trainingProvider;   

    public ApprenticeChecklistSteps(Apprentice apprentice, Dictionary<string, UserDetails> userDetails)
    {
        _apprentice = apprentice;
        _employer = userDetails["Employer"];
        _trainingProvider = userDetails["Training Provider"];
    }

    //etc

Проблема в том, что если я запускаю Scenario A, для Dictionary<string, UserDetails> userDetails не будет регистрации, и я получу ошибку Multiple public constructors with same maximum parameter count are not supported!.

Как я могу поделитьсяпошаговые привязки между сценариями, если у меня не обязательно есть или нужен определенный параметр конструктора?

Единственные решения, которые я вижу, - это хаки

Создание «пустых» регистраций для всех неиспользуемых конструкторовпараметры, чтобы они инициализировались

Или ...

Создайте отдельный POCO, который содержит все возможные регистрации, и зарегистрируйте все, что мне нужно, тогдаn Мне это нужно

public class CheckListContext
{
    public Apprentice Apprentice { get; set; }
    public Dictionary<string, UserDetails> UserDetails { get; set; }
}

Регистрация в Сценарии A BeforeScenario Шаг тогда станет ...

_container.RegisterInstanceAs<CheckListContext>(new CheckListContext{Apprentice = apprentice});

1 Ответ

1 голос
/ 27 октября 2019

Похоже, вы просто хотите обмениваться данными между шагами, а не привязками шагов. Способ сделать это в SpecFlow - использовать контекст сценария, чтобы установить данные за один шаг и извлечь их на другом шаге. Например, у меня будет шаг с именем Given an apprenticeship exists. Определение шага для этого будет выглядеть примерно так:

[Binding]
public class ApprenticeshipSteps
{
    private readonly ScenarioContext scenario;

    public ApprenticeshipSteps(ScenarioContext scenario)
    {
        this.scenario = scenario;
    }

    [Given(@"an apprenticeship exists")]
    public void GivenAnApprenticeshipExists()
    {
        var apprenticeship = new Apprenticeship(...);

        scenario["apprenticeship"] = apprenticeship;

        // save to database if need be
    }
}

[Binding]
public class MoreStepDefinitions
{

    private readonly ScenarioContext scenario;

    public MoreStepDefinitions(ScenarioContext scenario)
    {
        this.scenario = scenario;
    }

    [Then(@"a step that needs the apprenticeship")]
    public void AnotherStep()
    {
        var apprenticeship = (Apprenticeship)scenario["apprenticeship"];
    }
}

При необходимости вы можете вместо этого поместить идентификатор ученичества в контекст сценария, если вам нужно получить его из базы данных. Контекст сценария - это просто пакет данных, передаваемых из определения шага в определение шага. Это предпочтительный способ обмена данными между шагами в SpecFlow.

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