我开始编写单元测试(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
答案 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");
}
并且工作!!