如何在控件进入方法之前在基类中获取xunit测试方法名称?

时间:2015-07-03 18:01:34

标签: c# .net xunit

我想在基类中找到测试方法名称。

这是我的用例

public class TestClass : Base
{
    [Fact]
    public void TestMehthod()
    {
    }
}

public class Base
{
    public Base()
    {
        Console.WriteLine("Test method name is "+); // how to get test method     name here.
    }
}

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

public class Base
{
    public Base()
    {
        string methodName = this.GetType().GetMethods()
                                          .Where(m => m.GetCustomAttributes<FactAttribute>().Any())
                                          .Select(m => m.Name)
                                          .FirstOrDefault();
        Console.WriteLine("Test method name is " + methodName); // how to get test method     name here.
    }
}

修改

xUnit具有在测试之前和之后运行的属性钩子的概念。 如果你想在运行它时知道方法的名称 - 你可以创建你的属性,将其输出到控制台:

public class MethodNameToConsoleAttribute : BeforeAfterTestAttribute
{
    public override void Before(MethodInfo methodUnderTest)
    {
        Console.WriteLine("Test method name is " + methodUnderTest.Name);
    }
}

然后把它放在你的基类上:

[MethodNameToConsole]
public class Base
{
   ...
}

编辑2:

好的,现在我看到了你想要达到的目标。 我必须说,目前xUnit没有提供任何正常的方法来做到这一点。但是它有一个名为ITestOutputHelper的其他概念,它允许您将输出添加到xUnit。在版本2中,xUnit团队只有一个此接口的实现,名为TestOutputHelper,它包含一个ITest类型的私有字段。

在这种特殊情况下,我们可以通过hack检索私有成员,然后从中测试方法名称。它看起来像这样:

public class Base
{
    public Base(ITestOutputHelper testOutputHelper)
    {
        var helper = (TestOutputHelper)testOutputHelper;

        ITest test = (ITest)helper.GetType().GetField("test", BindingFlags.NonPublic | BindingFlags.Instance)
                                  .GetValue(helper);

        testOutputHelper.WriteLine("Test method name is " + test.TestCase.TestMethod.Method.Name);
    }
}

但是我不建议你放下它,因为它的实施细节可能会在未来发生变化。

我宁愿在Github上创建一个问题来指定你需要的这个特殊情况。 xUnit是开源项目,您可以随时写信给开发人员。