使用 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>
我有一个旧的应用程序,它是通过直接调用完成跟踪编码的
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>