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 内部的东西)。
- NUnit 多次调用此 CustomAttribute,最终测试名称正确。
- 直到今天,带有 AdHockTestMethod 过滤器的 CustomAttribue 代码仍然有效。
- 但是今天 TestName 总是 AdHocTestMethod
- 我似乎无法找出为什么会这样。还有什么我想念的吗?
我的测试代码是这样的:
[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);
}
}
我为我的测试项目开发了一个 CustomAttribute class,名称如下:
[Test, CustomAttribute]
它的工作是在输入时获取当前测试名称,使用此代码:
var testName = TestContext.CurrentContex.Test.Name
每次调用时,至少有一个此字符串的实例:
AdHockTestMethod
我一直不知道为什么;但我放入了一个过滤器以忽略它,因为这不是我需要的测试名称。 (这似乎是 NUnit 内部的东西)。
- NUnit 多次调用此 CustomAttribute,最终测试名称正确。
- 直到今天,带有 AdHockTestMethod 过滤器的 CustomAttribue 代码仍然有效。
- 但是今天 TestName 总是 AdHocTestMethod
- 我似乎无法找出为什么会这样。还有什么我想念的吗?
我的测试代码是这样的:
[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);
}
}