log4net - LogicalThreadContext - 和单元测试用例

时间:2014-05-14 17:32:55

标签: multithreading unit-testing log4net

我开始编写单元测试(MS测试,Resharper作为测试运行器)。当我设置LogicalThreadContext(见下文)时,我的测试用例被中止了#39;谁知道为什么?这与单元测试在不同的线程上有关吗?我该如何解决这个问题?

[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会被调用并传递,因此在该行代码之后发生了一些事情...这就是为什么我认为它可能有某些东西与测试线程等有关。

谢谢!

更新: 所以我在MSTest中运行了这个测试并得到了这个例外(Resharper没有显示它)

单元测试适配器抛出异常: 对于成员' log4net.Util.PropertiesDictionary,log4net,Version = 1.2.13.0,Culture = neutral,PublicKeyToken = 669e0ddf0bb1aa2a' ..

未解析类型

我在VS2013,.Net 4.5上使用log4net v1.2.13。

这个链接似乎暗示它是一个引用的程序集问题,但没有解决方案。任何其他想法都会受到欢迎,GAC&log。log4net不是一个选项。 https://issues.apache.org/jira/browse/LOG4NET-398

4 个答案:

答案 0 :(得分:31)

我最终这样做是为了让它运转起来:

将它放在TestCleanup()方法中:

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

答案 1 :(得分:1)

所以,我不能完全感谢你想出这个来调用FreeNamedDataSlot。这让我得到了对我有用的答案。我只需要使用类名:

,而不是传入类的完整命名空间

这在我的数据访问层深处使用:

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

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

这对我来说非常完美!希望这在使用Visual Studio的测试环境时帮助其他人。

答案 2 :(得分:0)

我知道这有点老了,但以下内容对我有用。

尽管我的项目和单元测试都引用了log4net,但是未在单元测试中对其进行配置。将我的ThreadContext帮助器更新为以下允许我的测试成功。如果在单元测试中配置了log4net,但仍然出现此问题,则可以改掉编译符号。

var is_configured = log4net.LogManager.GetRepository().Configured;
var props = is_configured
            ? (ContextPropertiesBase)LogicalThreadContext.Properties
            : (ContextPropertiesBase)ThreadContext.Properties;
props[key] = value;

答案 3 :(得分:-3)

感谢所有提示,我尝试:

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

并且工作!!