TestContext.CurrentContext.Test
有几个属性,如FullName,可以解析这些属性以获取NUnit中的当前测试方法。但是,当使用 TestCase 属性上的 TestName 属性重写测试的名称时,这些根本无济于事。
有没有一种简单的方法可以从 NUnit 测试中获取当前测试方法的方法信息?我不能简单地使用堆栈跟踪,因为当测试方法不在堆栈上时,我需要在设置和拆卸中使用此信息。
我正在使用 NUnit 2.6.2
到的一件事是编写一个自定义的 NUnit EventListener
插件。
然后,您可以挂钩到测试运行程序的运行周期中,至少在TestStarted
重载时,您将拥有TestName
对象。这不会直接提供 MethodInfo,但您可以通过在那里使用给定的属性来获取它。
祝你好运!
NUnit 不提供此类信息 - 但它可以通过私有字段和属性进行查询。例如,可以使用以下代码(使用 NUnit 3.13.2 进行测试):
/// <summary>
/// Accesses private class type via reflection.
/// </summary>
/// <param name="_o">input object</param>
/// <param name="propertyPath">List of properties in one string, comma separated.</param>
/// <returns>output object</returns>
object getPrivate(object _o, string propertyPath)
{
object o = _o;
var flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
foreach (var name in propertyPath.Split('.'))
{
System.Type type = o.GetType();
if (char.IsUpper(name[0]))
o = type.GetProperty(name, flags).GetValue(o);
else
o = type.GetField(name, flags).GetValue(o);
}
return o;
}
[SetUp]
public void EachSpecSetup()
{
var mi = (MemberInfo)getPrivate(TestContext.CurrentContext.Test, "_test.Method.MethodInfo");
// Alternative method - using Exposed nuget package:
//dynamic test = Exposed.From(TestContext.CurrentContext.Test)._test;
//dynamic method = Exposed.From(test)._method;
FactAttribute attr = mi.GetCustomAttribute<FactAttribute>();
string path = attr.FilePath;
string funcName = attr.FunctionName;
}
就像上面的代码中提到的,也可以使用Exposed.From
- 但主要示例理论上应该更快。
如果任何字段/属性无效,代码将引发异常 - 这是有意的 - 使用 Visual Studio 监视窗口来识别类型/字段/属性。