NUnit CustomAttribute 始终将 TestName 显示为 AdHockTestMethod。我该如何解决?

NUnit CustomAttribute always shows the TestName as AdHockTestMethod. How do I fix this?

我为我的测试项目开发了一个 CustomAttribute class,名称如下:

[Test, CustomAttribute]

它的工作是在输入时获取当前测试名称,使用此代码:

var testName = TestContext.CurrentContex.Test.Name

每次调用时,至少有一个此字符串的实例:

AdHockTestMethod

我一直不知道为什么;但我放入了一个过滤器以忽略它,因为这不是我需要的测试名称。 (这似乎是 NUnit 内部的东西)。

我的测试代码是这样的:

[TestFixture]
public class TestClassName: BaseClass {
[Test, CustomAttribue]
public async Task TestName(){
}
   // do something asynchronous here
}

当您尝试在创建测试上下文之前访问测试上下文时,NUnit 会创建一个 AdhocTestContext。临时上下文中(不存在的)测试方法的名称是 AdHocTestMethod。我怀疑这就是你得到的。

临时上下文在特定情况下很有用,这就是我们实现它的原因。然而,这是一种非常罕见的情况,事实证明,在更正常的情况下,临时上下文可能会非常混乱。

您尚未发布任何代码来表明您在代码中的哪个位置访问了 TestContext,但最常见的错误是尝试在 TestCaseSource 方法中访问它,即 not 在测试执行期间调用,但在一个世纪左右(计算机时间)之前调用。 :-)

希望我的猜测有帮助,但如果没有,请编辑问题以包含显示您正在创建和使用 TestContext 的位置的代码。

更新:

您将属性的代码作为一个单独的问题发布,这表明您正在属性构造函数中创建临时 TestContext。 (如前所述,它是作为您尝试访问它的副作用而自动创建的。)

您的评论还提到 NUnit“调用”该属性。那是一种误解。 NUnit 仅仅检查属性。它由运行时在需要时创建 - 这就是 C# 属性的工作方式。正因为如此,你永远不应该在属性的构造函数中做任何事情,这取决于任何外部事件......在这种情况下创建一个适当的测试上下文。通常,一个人只是保存任何构造函数参数以备后用。

不幸的是,您在您的特定情况下完成了这项工作,这只是运气。您的代码没有做任何事情来触发崩溃,但后来添加到它调用的 class 可能会触发崩溃。您最好 同时使用 NUnit 和运行时,而不是反对它们。 :-)

如果您希望该属性是“活动的”...也就是说,做一些事情而不只是保存数据,您应该使用 NUnit 的扩展接口之一。使用这些接口是使 NUnit 实际调用属性中的代码的唯一方法。自定义属性的接口在 https://docs.nunit.org/articles/nunit/extending-nunit/Custom-Attributes.html.

中有详细记录

根本原因原来是上面显示的异步方法声明。一旦我删除了该部分并将 Task.Run 与 Async 一起使用(在方法内部),一切正常。更新后的代码如下所示:

[Test, CustomAttribute]
public void TestName(){

  Task.Run(async ()=> await doSomething());
}

TestContext.CurrentContext.Test.Name 进行此更改后自行更正。我不知道为什么会这样。

CustomAttribute 代码如下所示:

public class CustomAttribute:Attribue{
  public void CustomAttribute(){
     var TestName = TestContext.CurrentContext.Test.Name;
     if(TestName == "AdhocTestMethod"){
       Nlog.info("Testname was AdhocTestMethod");
       return;
     }
     Start(TestName);
  } 
  private void Start(string TestName){
     Reporter.StartTest(TestName);
  }
}