Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试中的序列化异常_C#_.net_Unit Testing - Fatal编程技术网

C# 单元测试中的序列化异常

C# 单元测试中的序列化异常,c#,.net,unit-testing,C#,.net,Unit Testing,我的VisualStudio(2010)单元测试有问题 每当出现任何错误并抛出一种类型的异常时,UnitTestAdapter就会抛出SerializationExceptions,告诉我他不能反序列化抛出的异常 在我创建的单元测试中,这些测试主要是System.Data.SqlServerCe.SqlCeException或NHibernate.MappingException 我不明白为什么会这样。研究告诉我,最常见的原因是这些类型所在的程序集对UnitTestAdapter不可用,但当我查

我的VisualStudio(2010)单元测试有问题

每当出现任何错误并抛出一种类型的异常时,UnitTestAdapter就会抛出SerializationExceptions,告诉我他不能反序列化抛出的异常

在我创建的单元测试中,这些测试主要是
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);
    }
}