我有一个旧的应用程序,它是通过直接调用new TraceSource("SourceName").TraceInformation(...)来进行跟踪的。最后,我想回顾一下这段代码,并将源代码定义为静态私有元素,但现在我必须按原样处理它。
当使用MsTest v2时,测试框架自动地向Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.TraceListenerWrapper类型的System.Diagnostics.Trace.Listeners中添加一个侦听器,该监听器将将写入Diagnostics.Trace的所有跟踪复制到在test或Azure DevOps中可访问的测试日志中。
我的问题是:如何才能为我的(严重实现的) TraceSource实现相同的结果?
我已经尝试过基于相同的名称创建一个TraceSource,并添加了诊断跟踪中相同的侦听器,但是很明显,这是不起作用的,因为每次调用它都是一个新实例。我还尝试将其添加到app.config中,但构造函数需要接收一个TextWriter作为参数。
发布于 2022-05-20 20:51:29
这个解决方案最初是由线程Why are messages sent to trace source missing from all but the first unit test?上的@阿森纳·莫利琴科提出的,但它仍然有效。
基本上,您需要创建一个写入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>https://stackoverflow.com/questions/71758259
复制相似问题