首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MsTest v2测试日志跟踪TraceSource

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

Stack Overflow用户
提问于 2022-04-05 20:50:40
回答 1查看 79关注 0票数 0

我有一个旧的应用程序,它是通过直接调用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作为参数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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对象,并将其写入正确的位置。

代码语言:javascript
复制
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中注册

代码语言:javascript
复制
<configuration>
  <system.diagnostics>
    <sources>
      <source name="MyTraceSource">
        <listeners>
          <add name = "ConsoleTraceListener" type="MyNamespace.DirectToConsoleTraceListener, MyAssembly" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71758259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档