首页 > 解决方案 > 使用 NUnit,(如何)我可以测试设置 Thread.CurrentThread.Name 的代码吗?

问题描述

考虑这个测试

[TestFixture]
class Sample
{
    [Test]
    public void Test()
    {
        Thread.CurrentThread.Name = "Foo";
    }
}

如果我debug这个测试,它通过没有错误。

如果我run进行此测试,则会失败并出现以下异常

System.InvalidOperationException :此属性已设置且无法修改。

在运行模式下,测试线程的名称是“NonParallelWorker”。

在调试模式下,测试线程的名称是null

作为约束,假设不允许更改被测代码,并尝试设置线程的名称,而不先检查是否为空。

例如

public void SampleMethodUnderTest()
{
     // It is important that this method gets to set this field.
     Thread.CurrentThread.Name = "Important Value";
}

对文档和其他帖子的搜索已经枯竭......

问题

有什么方法可以禁用/修改 NUnit 的线程命名行为?

标签: nunit

解决方案


尝试添加RequiresThreadAttribute.

[TestFixture]
class Sample
{
    [Test, RequiresThread]
    public void Test()
    {
        Thread.CurrentThread.Name = "Foo";
    }
}

我认为这目前可以工作,尽管这会创建一个未命名的线程这一事实可能是一个实现细节,而不是一定会可靠地向前工作的东西,我不确定。当然,另一种选择是在测试中创建自己的用户控制线程,并将任何异常传递回 NUnit。


推荐阅读