在VS UNit测试中使用.Net跟踪源时出现对象异常

时间:2009-06-26 19:11:51

标签: .net logging mstest tracing

当我尝试使用我的VS2008单元测试项目调用TraceSource.TraceData时,我收到了一个Object Disposed Exception。我已经在下面包含了一个非常小的代码示例,它始终如一地重现问题。在我进行第一次单元测试后,我才会看到这一点 - 但是一旦我的网站启动并运行了很多用户,我就会预感到这会影响我。

就像第一次单元测试后底层流被关闭一样。非常感谢来自'溢出'大师的任何帮助。

步骤:

1)创建VS 2008单元测试项目

2)使用以下代码添加一个类:

namespace TracingError
{
    using System.Diagnostics;
    using Microsoft.VisualStudio.TestTools.UnitTesting;

    [TestClass]
    public class UnitTest1
    {
        public static TraceSource ts = new TraceSource("TraceTest");

        [TestMethod]
        public void A()
        {
            ts.TraceEvent(TraceEventType.Information, 1, "Hello from A");
        }

        [TestMethod]
        public void B()
        {
            ts.TraceEvent(TraceEventType.Information, 1, "Hello from B");
        }
    }
}

3)使用以下代码添加app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="TraceTest" switchName="SourceSwitch" switchType="System.Diagnostics.SourceSwitch">
        <listeners>
          <add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false" />
          <remove name="Default" />
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="SourceSwitch" value="Verbose" />
    </switches>
    <trace autoflush="true" indentsize="4"></trace>
  </system.diagnostics>
</configuration>

1 个答案:

答案 0 :(得分:3)

运行使用Trace.WriteLine调用的代码运行测试时遇到了同样的问题。运行单个测试很好,但是多次运行会触发以下调用堆栈:

System.IO.__Error.WriterClosed()
System.IO.StringWriter.Write(Char[] buffer, Int32 index, Int32 count)
System.IO.TextWriter.WriteLine(String value)
System.IO.TextWriter.SyncTextWriter.WriteLine(String value)
System.Diagnostics.TextWriterTraceListener.WriteLine(String message)
System.Diagnostics.TraceInternal.WriteLine(String message)
System.Diagnostics.Trace.WriteLine(String message)

经过一番调查后,我发现在测试设置中放置以下代码解决了这个问题:

[TestInitialize()]
public void Setup()
{
    Array.ForEach((from TraceListener tl in Trace.Listeners
                   where tl.Name != "Default"
                   select tl).ToArray(),
                   tl => Trace.Listeners.Remove(tl));

} 

显然,在mstest环境中运行时,多个跟踪侦听器出现问题。 MSTest正在添加一个System.Diagnostics.TextWriterTraceListener,它使用在第一次测试后处理的流。解决方法只是删除除默认值之外的所有Trace侦听器,从而有效地删除了添加mstest的侦听器。该问题似乎与mstest创建的跟踪流的某些不正确处理有关。之前我曾说过mstest为每个测试创建了一个AppDomain。事实并非如此。

我发现您向Microsoft here提交了错误报告,但没有收到任何有用的反馈。希望这个快速修复对你有用,就像它对我一样。