Исключение при удалении объекта при использовании источника трассировки .Net в тестах VS UNit - PullRequest
2 голосов
/ 26 июня 2009

Я получаю исключение Object Disposed, когда пытаюсь вызвать TraceSource.TraceData с моим проектом модульного тестирования VS2008. Я включил очень маленький пример кода ниже, который последовательно воспроизводит проблему. Я вижу это только после того, как я запускаю свой первый модульный тест, но у меня есть предчувствие, что это повлияет на меня, как только мой веб-сайт заработает с большим количеством пользователей.

Это похоже на то, что основной поток закрывается после первого модульного теста. Мы очень ценим любую помощь от гуру «переполнения».

Шаги:

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 Ответ

3 голосов
/ 02 сентября 2009

Я столкнулся с той же проблемой при запуске тестов, которые выполняли код с вызовами 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 здесь , но не получили никаких полезных отзывов. Надеюсь, это быстрое исправление будет работать для вас, как и для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...