我想在基类中找到测试方法名称。
这是我的用例
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.
}
}
答案 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是开源项目,您可以随时写信给开发人员。