我在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”方法中,以便它只在一个地方。