C# 单元测试中的序列化异常
我的VisualStudio(2010)单元测试有问题 每当出现任何错误并抛出一种类型的异常时,UnitTestAdapter就会抛出SerializationExceptions,告诉我他不能反序列化抛出的异常 在我创建的单元测试中,这些测试主要是C# 单元测试中的序列化异常,c#,.net,unit-testing,C#,.net,Unit Testing,我的VisualStudio(2010)单元测试有问题 每当出现任何错误并抛出一种类型的异常时,UnitTestAdapter就会抛出SerializationExceptions,告诉我他不能反序列化抛出的异常 在我创建的单元测试中,这些测试主要是System.Data.SqlServerCe.SqlCeException或NHibernate.MappingException 我不明白为什么会这样。研究告诉我,最常见的原因是这些类型所在的程序集对UnitTestAdapter不可用,但当我查
System.Data.SqlServerCe.SqlCeException
或NHibernate.MappingException
我不明白为什么会这样。研究告诉我,最常见的原因是这些类型所在的程序集对UnitTestAdapter不可用,但当我查看TestResults文件夹时,我看到了所需的每个程序集,包括System.Data.SqlServerCe.dll
和Nhibernate.dll
那么-我能做些什么来调试这个呢?我需要查看测试结果中的异常,以便它们在任何方面都有用。在运行Visual Studio单元测试时,
VSTestHost
是初始化和运行测试的过程
将创建一个新的AppDomain,并将AppDomain的基本目录设置为单元测试“Out”目录,该目录包含运行测试所需的所有程序集和依赖项
测试目录称为“TestResults”,位于解决方案文件所在的同一目录中。在的“TestResults”目录中,您将找到每个测试运行的一系列子目录
单元测试完成后,执行线程将返回到VSTestHost
进程的默认AppDomain。返回默认AppDomain的部分过程是对其调用上下文中的对象进行反序列化。但是,BaseDirectory已重置回包含VSTestHost
可执行文件的目录,该文件是“C:\Program Files\Microsoft Visual Studio{version}\Common7\IDE”
这会导致反序列化失败,因为在VSTestHost
目录中找不到要反序列化的类型。异常内容大致如下:
单元测试适配器引发异常:未解析成员“xxx,xxx,Version=2.0.3370.22002,Culture=neutral,PublicKeyToken=null”的类型
一个可能的黑客可能是在“C:\Program Files\Microsoft Visual Studio{version}\Common7\IDE”中创建一个名为“UnitTestAssemblies”的目录。将所有必需的程序集复制到此目录中。然后手动编辑名为“VSTestHost.exe.config
”的VSTestHost
配置文件,以包括作为其探测路径一部分创建的目录:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="PrivateAssemblies;PublicAssemblies;UnitTestAssemblies"/>
</assemblyBinding>
来分析资源加载过程,因此我希望您能发现问题的神秘本质好吧,在浪费了大量的工时之后,我偶然发现了解决方案。或多或少
为我指明了方向,更具体地说是引语
总而言之,MyCustomException是在测试执行的早期阶段抛出的。包含它的dll尚未加载,因此单元测试适配器确实无法访问它
我使用自定义基类初始化需要数据库连接的单元测试。这个基类有一个正常的构造函数,而没有初始化,因为:
因此,在调用构造函数时,如果出现任何错误,则所有内容的执行显然都会停止
奇怪的是,这包括加载程序集。因此,当我的构造函数抛出异常时,NHibernate
的程序集尚未加载,导致成员NHibernate.hibernateeexception
的类型未解析
真是一次旅行。基本上,我现在所做的就是在构造函数中引入一个异常处理,以便在出现任何错误时失败:
public DatabaseAware()
{
XmlConfigurator.Configure();
try
{
_logger.Info("Configuring NHibernate");
_configuration = new Configuration().Configure();
_sessionFactory = _configuration.BuildSessionFactory();
}
catch (Exception ex)
{
_logger.Fatal(ex);
Assert.Fail(ex.Message);
}
}
现在,我可以像以前一样毫无问题地运行测试了。(或者,至少当构造函数出现问题时,会通知我)。好的,我理解这一点并会尝试。但为什么这是必要的呢?这感觉像是一个真正讨厌的黑客。这不应该是现成的吗?我知道我为其他项目创建了单元测试,但从未遇到过这个问题。@FlorianPeschka似乎是一个众所周知的问题,或者说很有趣。我想知道为什么我有一些项目,这是完美的作品。一定与项目设置有关,对吗?@FlorianPeschka对不起,我发现了一个有趣的链接,我想知道是否已修复,你确定System.Data.SqlServerCe.dll在你复制的文件夹中吗?我发现了问题。完全不同。谢谢你的大力支持!
public DatabaseAware()
{
XmlConfigurator.Configure();
try
{
_logger.Info("Configuring NHibernate");
_configuration = new Configuration().Configure();
_sessionFactory = _configuration.BuildSessionFactory();
}
catch (Exception ex)
{
_logger.Fatal(ex);
Assert.Fail(ex.Message);
}
}