如何在SpecFlow中的AfterStep绑定中选择一个步骤的堆栈跟踪

时间:2015-01-05 16:18:29

标签: c# stack-trace specflow

我在VS2013中使用SpecFlow运行单元测试

我有一个名为AfterStep的方法,如下所示:

[AfterStep]
private static void AfterStep()
{
    string attribute = ScenarioContext.Current.CurrentScenarioBlock.ToString();
    string extractedValue = GetAttributeValue(attribute);
}

以下是GetAttributeValue方法的代码:

public static string GetAttributeValue(string attribute)
{
        string attrValue = "";
        StackTrace stackTrace = new StackTrace();
        MethodBase method = stackTrace.GetFrame(1).GetMethod();

        switch (attribute)
        {
            case "Given":
                GivenAttribute givenAttr = (GivenAttribute)method.GetCustomAttributes(typeof(GivenAttribute), true)[0];
                attrValue = givenAttr.Regex;
                break;
            case "When":
                WhenAttribute whenAttr = (WhenAttribute)method.GetCustomAttributes(typeof(WhenAttribute), true)[0];
                attrValue = whenAttr.Regex;
                break;
            case "Then":
                ThenAttribute thenAttr = (ThenAttribute)method.GetCustomAttributes(typeof(ThenAttribute), true)[0];
                attrValue = thenAttr.Regex;
                break;
        }

        return attrValue;
}

但它似乎没有返回在“AfterStep”之前调用的方法,即“Step_ConnectToVMS”。

以下是Step_ConnectToVMS步骤方法的示例:

[When(@"I open VMS and connect")]
public static void Step_ConnectToVMS(Table LoginDetails)
{
  //Log into VMS
}

我注意到,如果我从Step_ConnectToVMS方法本身调用“GetAttributeValue”,它就有效。如果我在“AfterStep”方法中调用它,它就无法工作。

我基本上想要抓取的“AfterStep”方法是在它之前调用的方法的StackFrame(在本例中为Step_ConnectToVMS),以便我可以提取属性值。

使用这些值,我可以在我的自定义结果记录器中使用它们,它包含额外的信息(我不能自由地进入这里)但我真正需要的是这些步骤“描述”即属性(给定) ,When Then)和值(“我打开VMS并连接”)以形成此日志的标题。

当我获取这些值时,我将其写入XML日志,然后由ASP.NET Web服务器获取此日志并生成页面。

正如我在评论中提到的,我有一个可行的系统,但它涉及我在我创建的每个步骤方法中放入“GetAttributeValue”。我想把它放在“AfterStep”方法中,以便它只在一个地方。

0 个答案:

没有答案