如何对挂钩使用参数化方法-SpecFlow

时间:2020-07-24 00:48:13

标签: c# bdd specflow

在我们的项目中,我们有多个按SKU ID区分的SKU。我们正在测试将SKU添加到数据库的不同方案。在每个方案之后,都应在Db中进行清理,以删除由特定方案使用AfterScenario挂钩添加的SKU。清理方法应接收每个方案添加的SKU ID,以便仅删除那些数据。如何将参数传递给由AfterScenario标记的清理方法(下面给出了需求示例)。

  [AfterScenario]
  public void Cleanup(string skuId)
  {
      //delete skuId from Db.
  }

1 个答案:

答案 0 :(得分:2)

最好将每个方案创建的SKU放在ScenarioContext中,以对其进行跟踪。您可以将此引用作为步骤定义的构造函数参数。然后,您可以在钩子中访问它并删除它们:

public class SkuSteps
{
    private readonly ScenarioContext scenario;
    
    public SkuSteps(ScenarioContext scenario)
    {
        this.scenario = scenario;
    }
    
    [Given(@"a sku named ""(.*)"" exists")]
    public void GivenASkuNamedExists(string sku)
    {
        // create sku
        scenario.AddSku(sku);
    }
}

public static class ScenarioExtensions
{
    public static void AddSku(this ScenarioContext scenario, string sku)
    {
        var skus = scenario.GetSkus();
        
        skus.Add(sku);
    }
    
    public static List<string> GetSkus()
    {
        if (!scenario.ContainsKey("skus"))
        {
            scenario["skus"] = new List<string>();
        }
        
        return (List<string>)scenario["skus"];
    }
}
        
public class Hooks
{
    private readonly ScenarioContext scenario;

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

    [AfterScenario]
    public void DeleteSkus()
    {
        var skusToDelete = scenario.GetSkus();
        
        // delete the skus
    }
}