使用 TraceSource 跟踪到 MsTest v2 测试日志

Trace to MsTest v2 test log using TraceSource

我有一个旧的应用程序,它是通过直接调用完成跟踪编码的 new TraceSource("SourceName").TraceInformation(...)。最后,我想查看这段代码并将源定义为静态私有元素,但现在我必须按原样处理它。

使用 MsTest v2 时,测试框架会自动向 System.Diagnostics.Trace.Listeners 添加一个类型为 Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.TraceListenerWrapper 的侦听器,该侦听器会将写入 Diagnostics.Trace 的每个跟踪复制到 [= 中可访问的测试日志中21=]Test Explorer 或 Azure DevOps.

我的问题是:如何为我的(实施不当的)TraceSource 获得相同的结果?

我已经尝试创建一个基于相同名称的 TraceSource 并添加与 Diagnostics 跟踪中相同的侦听器,但显然,这不起作用,因为它每次调用时都是一个新实例。 我也尝试将它添加到 app.config 但构造函数需要接收一个 TextWriter 作为参数。

此解决方案最初由@Arseni Mourzenko 在线程 上提出,但仍然有效。

基本上,您需要创建一个写入 Console 的自定义侦听器。

之所以与标准ConsoleTraceListener相反,是因为后者在对象构造期间将Console.Out TextWriter存储在一个字段中,而Console.Out是一个每个测试的新对象。

由于在 app.config(静态)中配置时侦听器仅初始化一次,因此它仅存储第一次测试中的编写器。另一端的建议实现在每次调用时直接使用 Console 对象,并写入正确的位置。

using System;
using System.Diagnostics;
using System.IO;
using System.Text;

namespace MyNamespace
{
    public class DirectToConsoleTraceListener : TextWriterTraceListener
    {
        public DirectToConsoleTraceListener() : base(new DirectToConsoleTextWriter())
        {
        }

        public override void Close()
        {
        }
    }

    public class DirectToConsoleTextWriter : TextWriter
    {
        public override Encoding Encoding
        {
            get
            {
                return Console.Out.Encoding;
            }
        }

        public override void Write(string value)
        {
            //Console.Out.Write(value);
            Console.Write(Console.Out.GetHashCode() + ": " + value);
        }

        public override void WriteLine(string value)
        {
            //Console.Out.WriteLine(value);
            Console.WriteLine(Console.Out.GetHashCode() + ": " + value);
        }
    }
}

正在注册 app.config

<configuration>
  <system.diagnostics>
    <sources>
      <source name="MyTraceSource">
        <listeners>
          <add name = "ConsoleTraceListener" type="MyNamespace.DirectToConsoleTraceListener, MyAssembly" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>