Внедрение контекста Specflow - PullRequest
3 голосов
/ 07 апреля 2020

Вот вопрос о внедрении контекста в specflow. У меня есть класс с моей сущностью:

public class OrderInfo
{
    public string Status { get; set; }
    public string OrderName { get; set; }
}

В другом классе я использую эту сущность для создания нового заказа:

[Binding]
public class OrderSteps
{
    private NgWebDriver driver;
    private OrderInfo orderInfo = new OrderInfo();

    public OrderSteps(NgWebDriver driver,OrderInfo orderInfo)
    {
        this.orderInfo = orderInfo;
        this.driver = driver;
    }

    [When(@"I am creating new order")]
    public void WhenIAmCreatingNewOrder(Table table)
    {
        var orderListPage = new OrdersListPage(driver);
        orderInfo = orderListPage.CreateNewOrder(table.CreateInstance<OrderInfo>());
    }
}

В этом классе мой метод возвращает некоторые данные, которые хранятся в объекте 'orderInfo'. Все в порядке, пока мне не понадобилось использовать данные из этого объекта в другом классе. Я пытаюсь получить данные моего объекта, но он пуст внутри ...

    [Binding]
public class BuyerPortalSteps
{
    private NgWebDriver driver;
    private OrderInfo orderInfo;

    public BuyerPortalSteps(NgWebDriver driver, OrderInfo orderInfo)
    {
        this.driver = driver;
        this.orderInfo = orderInfo;
    }
}

Итак, вопрос: как использовать данные во втором классе из объекта, который был заполнен данными первый класс

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Вы можете использовать ScenarioContext и передать его. Хорошая вещь в этом подходе заключается в том, что вам не нужно регистрировать что-то новое в контейнере объекта.

Чтобы создать «текущий заказ» в OrderSteps:

[Binding]
public class OrderSteps
{
    private readonly NgWebDriver driver;
    private readonly ScenarioContext scenario;

    private OrderInfo CurrentOrder
    {
        get => (OrderInfo)scenario["OrderInfo"];
        set => scenario["OrderInfo"] = value;
    }

    public OrderSteps(NgWebDriver driver, ScenarioContext scenario)
    {
        this.driver = driver;
        this.scenario = scenario;
    }

    [When(@"I am creating new order")]
    public void WhenIAmCreatingNewOrder(Table table)
    {
        var orderListPage = new OrdersListPage(driver);

        CurrentOrder = orderListPage.CreateNewOrder(table.CreateInstance<OrderInfo>());;
    }
}

Затем использовать Объект OrderInfo в другом классе:

[Binding]
public class BuyerPortalSteps
{
    private readonly NgWebDriver driver;
    private readonly ScenarioContext scenario;
    private OrderInfo CurrentOrder => (OrderInfo)scenario["OrderInfo"];

    public BuyerPortalSteps(NgWebDriver driver, ScenarioContext scenario)
    {
        this.driver = driver;
        this.scenario = scenario;
    }

    [Then(@"I am looking for order on buyer statistics grid")]
    public void ThenIAmLookingForOrderOnBuyerStatisticsGrid()
    {
        var buyerPortalDashboard = new BuyerPortalDashboard(driver);

        buyerPortalDashboard.CheckBuyerDashboardStatistic(CurrentOrder);
    }
}

Я также создал методы расширения для ScenarioContext, что также может быть удобно:

namespace YourProject.Tests
{
    public static class OrderScenarioContextExtensions
    {
        public static OrderInfo GetCurrentOrder(this ScenarioContext scenario)
        {
            return (OrderInfo)scenario["OrderInfo"];
        }

        public static void SetCurrentOrder(this ScenarioContext scenario, OrderInfo currentOrder)
        {
            scenario["OrderInfo"] = currentOrder;
        }
    }
}

Затем вы можете вызывать эти методы расширения везде, где вам нужно иметь ScenarioContext объект:

var order = scenario.GetCurrentOrder();

var order = new OrderInfo();

scenario.SetCurrentOrder(order);

Дополнительная информация: Внедрение в контекст сценария (документы SpecFlow)

0 голосов
/ 08 апреля 2020

Похоже, я нашел решение. Я создал дочерний подкласс для своего OrderInfo:

public class OrderInfoContext
{
    public OrderInfo OrderInfo { get; set; }
}

И в моем классе Binding произошли некоторые изменения:

public class OrderSteps
{
    private NgWebDriver driver;
    private List<FilterInfo> filterData = new List<FilterInfo>();
    private OrderInfoContext orderInfoContext;
    private OrderInfo orderInfo;

    public OrderSteps(NgWebDriver driver, OrderInfoContext orderInfoContext)
    {
        this.driver = driver;
        this.orderInfoContext = orderInfoContext;
    }

    [When(@"I am creating new order")]
    public void WhenIAmCreatingNewOrder(Table table)
    {
        var orderListPage = new OrdersListPage(driver);
        orderInfo = orderListPage.CreateNewOrder(table.CreateInstance<OrderInfo>());
        orderInfoContext.OrderInfo = orderInfo;
    }
}

И теперь я могу использовать сохраненную информацию в моем другом классе:

    [Binding]
public class BuyerPortalSteps
{
    private NgWebDriver driver;
    private OrderInfoContext orderInfoContext;

    public BuyerPortalSteps(NgWebDriver driver, OrderInfoContext orderInfoContext)
    {
        this.driver = driver;
        this.orderInfoContext = orderInfoContext;
    }

    [Then(@"I am looking for order on buyer statistics grid")]
    public void ThenIAmLookingForOrderOnBuyerStatisticsGrid()
    {
        BuyerPortalDashboard buyerPortalDashboard = new BuyerPortalDashboard(driver);
        buyerPortalDashboard.CheckBuyerDashboardStatistic(orderInfoContext.OrderInfo);
    }
}

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

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