问题 在新的应用程序域中运行时,如何将stdout输入mstest输出?


我一直在研究测试框架,它创建了一个新的应用程序域来运行测试。主要原因是我们正在测试的dll有一些可怕的代码依赖于位于app域路径中的dll。 (不,我无法更改此代码。)

我遇到的问题是我的测试团队正在mstest中编写一组功能测试,其中一个记录器写入Console.Out,没有在trx输出中捕获任何日志信息。通过控制台应用程序运行代码时,所有日志信息都可以正常输出。其他已经实施的记录器也是如此。

我的想法是mstest正在将自己的TextWriter设置为Console.Out,但新的应用程序doamin有自己的TextWriter for Console.Out,因为新的app域有它自己的静态集。

我很感激你的想法。


9921
2018-03-08 10:58


起源

注意:此问题和接受的答案也适用于NUnit的“文本输出”窗口和用于创建新应用程序域的测试(并写入stdout)。 - Yodan Tauber


答案:


我觉得有点羞怯,但是一旦我发送并再次考虑它,问题有点变得明显,我找到了解决方案。

问题是原始的Console.Out被mstest设置为一个新的TextWriter,并没有在我的新应用程序域中设置。

所以我在我在新appdomain中创建的类上创建了一个SetConsoleOut方法,并将其传递给Console.Out。

TestFramework testFramework = 
          (TestFramework)newAppDomain.CreateInstanceAndUnwrap(
                                                "TestFrameworkLibrary",
                                                "MyNamespace.TestFramework");

testFramework.SetConsoleOut(Console.Out);

在TestFramework中我添加了方法

internal void SetConsoleOut(TextWriter consoleOut)
{
    Console.SetOut(consoleOut);
}

奇迹般有效。我不确定这里的礼仪。我应该删除问题还是添加问题的答案?


10
2018-03-08 11:09