【问题标题】:Object Disposed Exception when using .Net Trace Source within VS UNit Tests在 VS 单元测试中使用 .Net 跟踪源时出现对象处理异常
【发布时间】:2010-11-06 05:59:21
【问题描述】:

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

这就像在第一次单元测试后关闭了底层流。非常感谢“溢出”大师的任何帮助。

步骤:

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>

【问题讨论】:

  • switchType ="System.Diagnostics.SourceSwitch"> initializeData="false" /> 配置>
  • 找到解决方案了吗?我有同样的问题,但仅适用于某些测试(在同一个测试项目中)。许多使用 Trace 的测试都可以正常工作,但有些不能,我不知道为什么......

标签: .net logging mstest trace


【解决方案1】:

在运行使用 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环境中运行时,多个trace listeners有问题。 MSTest 正在添加一个 System.Diagnostics.TextWriterTraceListener,它正在使用在第一次测试之后释放的流。解决方法只是删除了除默认值之外的所有 Trace 侦听器,有效地删除了 mstest 添加的侦听器。该问题似乎与对 mstest 创建的跟踪流的某些不当处理有关。之前我说过 mstest 为每个测试创建了一个 AppDomain。这不是真的。

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

【讨论】:

    猜你喜欢
    • 2012-03-02
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    相关资源
    最近更新 更多