2

TestContext.CurrentContext.Test有几个像 FullName 这样的属性,可以解析这些属性以获取 NUnit 中的当前测试方法。但是,当使用 TestCase 属性上的 TestName 属性覆盖测试名称时,这些都没有帮助。

有没有一种简单的方法可以从 NUnit 测试中获取当前测试方法的 MethodInfo?我不能简单地使用堆栈跟踪,因为当测试方法不在堆栈上时,我需要 SetUp 和 TearDown 中的这些信息。

我正在使用 NUnit 2.6.2

4

2 回答 2

0

我想到的一件事是编写自定义 NUnitEventListener插件

然后你可以挂钩到测试运行器的运行周期,至少在TestStarted重载时你将拥有该TestName对象。这不会直接提供 MethodInfo ,但您可以通过使用那里的给定属性来获得它。

祝你好运!

于 2013-10-04T09:23:29.277 回答
0

默认情况下,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 监视窗口来识别类型/字段/属性。

于 2022-01-04T21:41:22.913 回答