如何在SpecFlow中更好地使用ScenarioContext以获得可维护性

时间:2018-09-25 17:27:43

标签: c# cucumber bdd specflow

在用于存储运行时值的测试项目中,我在SpecFlow中使用了许多“测试上下文”变量,如下所示。我在VS2018中将SpecFlow与C#一起使用。

ScenarioContext.Current["PostResponse"] = postResponse;
ScenarioContext.Current["PutResponse"] = putResponse;

但是当前实现上有一些更改,PUT响应需要更改为POST响应才能创建新对象,并在更新对象时保持原样。因此,现在我必须根据场景分别更新场景上下文的每个部分,并需要对其进行更新。这不是明智的做法。我本来可以将“ objectcreationResponse”,“ objectupdateResponse”存储在一个普通的地方,所以在一个地方进行更改会更容易。而且我在运行时使用了很多Scneario上下文。有没有更好的使用方法?

1 个答案:

答案 0 :(得分:0)

您可以使用C#扩展方法集中进行此操作:

public static class ScenarioContextExtensions
{
    public static UpdateResponseType GetUpdateReponse(this ScenarioContext context)
    {
        return context["updateResponse"] as UpdateResponseType;
    }

    public static void SetUpdateResponse(this ScenarioContext context, UpdateResponseType updateResponse)
    {
        return context["updateResponse"] = updateResponse;
    }
}

现在在任何地方都有ScenarioContext对象,您都已强力键入了用于此公共信息的getter和setter:

ScenarioContext.Current.GetUpdateResponse();
ScenarioContext.Current.SetUpdateResponse(...);

这使您可以利用Visual Studio中提供的所有重构工具,从而减轻您描述的问题。