C# Specflow上下文注入
下面是关于specflow中上下文注入的问题。我与我的实体有类:C# Specflow上下文注入,c#,automation,specflow,C#,Automation,Specflow,下面是关于specflow中上下文注入的问题。我与我的实体有类: public class OrderInfo { public string Status { get; set; } public string OrderName { get; set; } } 在另一个类中,我使用此实体创建新订单: [Binding] public class OrderSteps { private NgWebDriver driver; private OrderInf
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创建了一个子类:
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;
}
}
我认为原因是,如果您想在类之间共享数据,您必须初始化此数据一次,并且永远不要尝试再次编辑它,因为在您阅读它之前,它可以在途中的任何位置进行更改……这只是我的假设。您可以使用
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>());;
}
}
我还在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);
更多信息:
[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);
}
}
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;
}
}
}
var order = scenario.GetCurrentOrder();
var order = new OrderInfo();
scenario.SetCurrentOrder(order);