Подтвердить что ты не робот

Log4net - логическийThreadContext - и unit test случаи

Я начинаю писать unit test (MS Test, с Resharper как тестовый бегун). Когда я устанавливаю LogicalThreadContext (см. Ниже), мои тестовые примеры "прерываются". Кто-нибудь знает, почему? Связано ли это с unit test на другом потоке? Как это разрешить?

[TestClass]
public class ContextInfoTest
{
    private ILog _log;


    [TestInitialize]
    public void TestInitialize()
    {
        // logging configured in assembly.info
        _log = LogManager.GetLogger(this.GetType()); 
    }


    [TestMethod]
    public void FigureOutWhyAborting()
    {
        string input = "blah";
        LogicalThreadContext.Properties["mypropertyname"] = input;

        string output = LogicalThreadContext.Properties["mypropertyname"] as string;
        Assert.AreEqual(input, output);
    }


    [TestMethod]
    public void ThisWorks()
    {
        string input = "blah";
        CallContext.LogicalSetData("mypropertyname", input);

        string output = CallContext.LogicalGetData("mypropertyname") as string;
        Assert.AreEqual(input, output);
    }

Странно то, что если бы я должен был отлаживать и переходить через код, Assert.AreEqual действительно вызывается и проходит, так что что-то происходит после этой строки кода... вот почему я думаю, что это может иметь что-то с тестовой нитью и т.д.

Спасибо!

UPDATE: Поэтому я проверил этот тест в MSTest и получил это исключение (Resharper не показывал его)

Unit Test Адаптер сбросил исключение: Тип не разрешен для члена log4net.Util.PropertiesDictionary, log4net, Version = 1.2.13.0, Culture = neutral, PublicKeyToken = 669e0ddf0bb1aa2a '..

Я использую log4net v1.2.13, на VS2013,.Net 4.5.

Эта ссылка, похоже, предполагает, что это проблема с сборками, но разрешения нет. Любые дополнительные идеи будут очень приветствуемы, GAC'ing log4net не является вариантом. https://issues.apache.org/jira/browse/LOG4NET-398

4b9b3361

Ответ 1

В итоге я сделал это, чтобы заставить его работать:

поместите это в метод TestCleanup():

CallContext.FreeNamedDataSlot("log4net.Util.LogicalThreadContextProperties");

Ответ 2

Итак, я не могу поблагодарить вас за то, что вы поняли это, чтобы вызвать FreeNamedDataSlot. Это заставило меня ответить на мой ответ, который сработал у меня. Вместо того, чтобы переходить в полное пространство имен класса, мне просто нужно было использовать имя класса:

Это использовалось где-то глубоко в моем Уровне доступа к данным:

MySession session  = (MySession)System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("MySession");

[TestCleanup]
public void Cleanup()
{
    CallContext.FreeNamedDataSlot("MySession");
}

Это сработало идеально для меня! Надеюсь, это поможет кому-то другому при использовании среды тестирования Visual Studio.

Ответ 3

Спасибо всем за советы, я пробую:

[TestCleanup]
public void Cleanup()
{
   CallContext.FreeNamedDataSlot("log4net.Util.LogicalThreadContextProperties");
}

И работает!!