如何在 NUnit 中访问当前的测试方法



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 监视窗口来识别类型/字段/属性。

最新更新