gpt4 book ai didi

c# - 为什么发送到跟踪源的消息在除第一个单元测试之外的所有单元测试中都丢失了?

转载 作者:行者123 更新时间:2023-11-30 12:41:49 25 4
gpt4 key购买 nike

我观察到 Visual Studio Enterprise 2015 Update 1 有一个奇怪的行为。在单元测试中通过 .NET Framework TraceSource 使用日志时,只有第一个单元测试包含日志输出。

这是重现问题的方法:

一个空的单元测试项目包含如下所示的 UnitTest1 类:

using System;
using System.Diagnostics;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class UnitTest1
{
private readonly TraceSource trace = new TraceSource("Demo", SourceLevels.All);

[TestMethod]
public void TestMethod1()
{
this.trace.TraceEvent(TraceEventType.Information, 0, "Test 1 (trace source)");
Console.WriteLine("Test 1 (console)");
}

[TestMethod]
public void TestMethod2()
{
this.trace.TraceEvent(TraceEventType.Information, 0, "Test 2 (trace source)");
Console.WriteLine("Test 2 (console)");
}
}

App.config 文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="Demo" switchValue="Critical, Error, Warning, ActivityTracing, Information, Verbose">
<listeners>
<add name="ConsoleTraceListener" />
<add name="TextFileListener" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="ConsoleTraceListener" type="System.Diagnostics.ConsoleTraceListener" />
<add name="TextFileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="tests.log" />
</sharedListeners>
</system.diagnostics>
</configuration>

从 Visual Studio 运行测试时:

  • 第一个单元测试的输出是:

    Test Name:  TestMethod1
    Test Outcome: Passed
    Result StandardOutput:
    Demo Information: 0 : Test 1 (trace source)
    Test 1 (console)

    同时显示来自跟踪源和控制台的消息。

  • 第二个单元测试的输出是:

    Test Name:  TestMethod2
    Test Outcome: Passed
    Result StandardOutput: Test 2 (console)

    虽然 Console.WriteLine 的输出运行良好,但未显示来自 TraceSource.TraceEvent 的输出。

通过执行 mstest/testcontainer:UnitTestProject1.dll 从控制台运行测试也会重现该问题。为第一个测试报告的 stdout 包含两行;第二个测试的 stdout 只有一行。

为什么除了第一个测试之外没有跟踪所有日志记录?

最佳答案

解决方法包括包装默认的 TextWriter,它使用底层 Console.Out 文本编写器来发送日志:

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

public override void Write(string value)
{
Console.Out.Write(value);
}

public override void WriteLine(string value)
{
Console.Out.WriteLine(value);
}
}

编写器然后在类似于 one used in .NET Framework 的自定义跟踪监听器中使用:

public class ConsoleTraceListener : TextWriterTraceListener
{
public ConsoleTraceListener() : base(new CustomTextWriter())
{
}

public override void Close()
{
}
}

在 App.config 中声明如下:

<add name="ConsoleTraceListener"
type="UnitTestProject1.ConsoleTraceListener, UnitTestProject1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

这会产生预期的输出,尽管仍然不清楚为什么问题首先存在。通过检查 Console.Out 和底层流,似乎在第一次测试结束后没有处理或关闭某些东西(如果会,为什么 the current implementation of Out 什么都不做,为什么 text发送到 Console.WriteLine 出现在日志中?)

关于c# - 为什么发送到跟踪源的消息在除第一个单元测试之外的所有单元测试中都丢失了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36327531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com