下面是关于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文档(