在VS单元测试中使用.Net跟踪源时对象处理的异常
当我尝试使用VS2008单元测试项目调用TraceSource.TraceData时,我遇到了一个对象处理异常。我在下面提供了一个非常小的代码示例,它不断地重新编写这个问题。我只是在运行了我的第一个单元测试之后才看到这一点,但我有一种预感,一旦我的网站启动并运行了很多用户,它就会影响到我 就像在第一次单元测试之后,底层流被关闭一样。非常感谢“溢出”大师的任何帮助 步骤: 1) 创建VS2008单元测试项目 2) 使用以下代码添加一个类:在VS单元测试中使用.Net跟踪源时对象处理的异常,.net,logging,mstest,trace,.net,Logging,Mstest,Trace,当我尝试使用VS2008单元测试项目调用TraceSource.TraceData时,我遇到了一个对象处理异常。我在下面提供了一个非常小的代码示例,它不断地重新编写这个问题。我只是在运行了我的第一个单元测试之后才看到这一点,但我有一种预感,一旦我的网站启动并运行了很多用户,它就会影响到我 就像在第一次单元测试之后,底层流被关闭一样。非常感谢“溢出”大师的任何帮助 步骤: 1) 创建VS2008单元测试项目 2) 使用以下代码添加一个类: namespace TracingError {
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");
}
}
}
<?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>
3) 使用以下代码添加app.config:
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");
}
}
}
<?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>
我在运行使用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,该Listener使用在第一次测试后释放的流。该解决方案只需删除除默认跟踪侦听器之外的所有跟踪侦听器,从而有效地删除mstest添加的侦听器。该问题似乎与mstest创建的跟踪流的某些不当处理有关。之前我说过mstest为每个测试创建了一个AppDomain。事实并非如此
我看到你向微软提交了一份bug报告,但没有收到任何有用的反馈。希望这个快速解决方案能像对我一样对您有效。switchType=“System.Diagnostics.SourceSwitch”>initializeData=“false”/>是否找到了解决方案?我也有同样的问题,但只针对一些测试(在同一个测试项目中)。很多使用Trace的测试都很好,但有些没有,我不明白为什么。。。