Ответ 1
В итоге я сделал это, чтобы заставить его работать:
поместите это в метод TestCleanup():
CallContext.FreeNamedDataSlot("log4net.Util.LogicalThreadContextProperties");
Я начинаю писать 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
В итоге я сделал это, чтобы заставить его работать:
поместите это в метод TestCleanup():
CallContext.FreeNamedDataSlot("log4net.Util.LogicalThreadContextProperties");
Итак, я не могу поблагодарить вас за то, что вы поняли это, чтобы вызвать FreeNamedDataSlot. Это заставило меня ответить на мой ответ, который сработал у меня. Вместо того, чтобы переходить в полное пространство имен класса, мне просто нужно было использовать имя класса:
Это использовалось где-то глубоко в моем Уровне доступа к данным:
MySession session = (MySession)System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("MySession");
[TestCleanup]
public void Cleanup()
{
CallContext.FreeNamedDataSlot("MySession");
}
Это сработало идеально для меня! Надеюсь, это поможет кому-то другому при использовании среды тестирования Visual Studio.
Спасибо всем за советы, я пробую:
[TestCleanup]
public void Cleanup()
{
CallContext.FreeNamedDataSlot("log4net.Util.LogicalThreadContextProperties");
}
И работает!!