规范流上下文注入



下面是关于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;
}
}

所以问题是:如何使用已经填充了第一类数据的对象中的第二类数据

似乎我找到了解决方案。我为我的订单信息创建了一个子类:

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

在我的绑定类中有一些更改:

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);
}
}

我认为原因是,如果你想在类之间共享数据,你必须初始化这个数据一次,再也不要试图编辑它,因为在你阅读它之前,它可以在任何地方更改……这只是我的假设

您可以使用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文档(

最新更新