C# 为什么NUnit不显示后台线程的控制台输出?
我的库有一些后台线程,它们将调试输出打印到Console.WriteLine()。在第一个测试中,我可以在测试的输出中看到来自后台线程的调试行。但接下来的测试不再显示此输出 如果我在测试方法本身中调用Console.WriteLine(),那么这将在测试输出中看到。我已经调试了它和测试调用C# 为什么NUnit不显示后台线程的控制台输出?,c#,multithreading,console,nunit,C#,Multithreading,Console,Nunit,我的库有一些后台线程,它们将调试输出打印到Console.WriteLine()。在第一个测试中,我可以在测试的输出中看到来自后台线程的调试行。但接下来的测试不再显示此输出 如果我在测试方法本身中调用Console.WriteLine(),那么这将在测试输出中看到。我已经调试了它和测试调用 测试中的第一个Console.WriteLine() 然后在后台测试中调用Console.WriteLine() 最后,它再次在测试中调用Console.WriteLine() 但是我只直接看到测试的输出
- 测试中的第一个Console.WriteLine()
- 然后在后台测试中调用Console.WriteLine()
- 最后,它再次在测试中调用Console.WriteLine()
如何从所有后台线程获取控制台输出?由于我们的库具有重定向日志输出的选项,我们可以在测试中执行以下操作:
[SetUp]
public void FixtureSetUp()
{
MyLibrary.Console = TestContext.Out;
}
这不是一个好的解决方案。因为我们的库有重定向日志输出的选项,所以我们可以在测试中执行以下操作:
[SetUp]
public void FixtureSetUp()
{
MyLibrary.Console = TestContext.Out;
}
这不是一个好的解决方案。它取决于您正在使用的NUnit框架的特定运行时构建。与文本捕获相关的信息保存在NUnit的
TestExecutionContext
中,它在不同的版本中以不同的方式存储
对于所有桌面版本(.NET 2.0、3.5、4.0和4.5),当前的TestExecutionContext
保存在CallContext
中。由于TestExecutionClass
实现了iLogicThreadAffinative
,因此在创建新线程时,上下文将跟随测试
对于我们的两个.NET标准版本(1.3和1.6),上下文保存在线程本地存储中,因此不会跟随新线程的创建。这是我们希望在有.NET标准2.0版本时克服的限制。这取决于您使用的NUnit框架的特定运行时版本。与文本捕获相关的信息保存在NUnit的
TestExecutionContext
中,它在不同的版本中以不同的方式存储
对于所有桌面版本(.NET 2.0、3.5、4.0和4.5),当前的TestExecutionContext
保存在CallContext
中。由于TestExecutionClass
实现了iLogicThreadAffinative
,因此在创建新线程时,上下文将跟随测试
对于我们的两个.NET标准版本(1.3和1.6),上下文保存在线程本地存储中,因此不会跟随新线程的创建。当有.NET标准2.0版本时,这是我们希望克服的一个限制。也许您应该向NUnit提出一个问题?无意冒犯,但我怀疑其他人会有答案。TestContext.WriteLine()有效吗?@RobProuse该库无法访问NUnit API。@RobProuse感谢TestContext的提示。@Horcrux7如果您能想出一个最小的复制,请提交一个问题。我们应该捕获整个调用上下文的控制台输出。也许您应该用NUnit打开一个问题?无意冒犯,但我怀疑其他人会有答案。TestContext.WriteLine()有效吗?@RobProuse该库无法访问NUnit API。@RobProuse感谢TestContext的提示。@Horcrux7如果您能想出一个最小的复制,请提交一个问题。我们应该捕获整个调用上下文的控制台输出。在100次尝试其他东西后唯一对我有效的东西。在100次尝试其他东西后唯一对我有效的东西。你是说答案?这是不是已经完成了?我在其他地方的做法是让旧答案保持不变,无论正确与否,因为它们是。。。历史的。:-)你是说答案是什么?这是不是已经完成了?我在其他地方的做法是让旧答案保持不变,无论正确与否,因为它们是。。。历史的。:-)