Visual Studio代码覆盖率分析抛出SqlCeException反序列化异常
问题分析与解决
问题描述
应用测试用例正常运行时全部通过,但使用Visual Studio代码覆盖率分析工具运行时,始终抛出如下异常:
Assert.Fail failed. The constructor to deserialize an object of type 'System.Data.SqlServerCe.SqlCeException' was not found.
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at MyTestlass.RunApplicationTest(CrossAppDomainDelegate test)
所有测试共享一个基类,其中包含初始化应用的方法:
protected static void RunApplicationTest(CrossAppDomainDelegate test) { ... }
原因
Visual Studio代码覆盖率工具运行测试时,默认可能启用了跨应用域执行测试模式。当跨应用域调用(CrossAppDomainDelegate)中抛出SqlCeException时,.NET需要将该异常序列化后传递回主应用域,但SqlCeException类型未实现用于反序列化的特定构造函数(即接收SerializationInfo和StreamingContext参数的构造函数),导致反序列化失败,触发上述异常。而正常运行测试时未启用跨域模式,因此不会出现该问题。
解决方法
- 关闭跨应用域测试模式:打开Visual Studio测试设置,找到代码覆盖率相关配置,禁用跨应用域运行测试的选项,改为在同一应用域内执行测试。
- 捕获并转换异常:在
RunApplicationTest方法的跨域调用内部,捕获SqlCeException,将其转换为自定义的可序列化异常(需实现带SerializationInfo和StreamingContext参数的构造函数)后再抛出,确保异常能正常跨域传递。 - 内部处理异常:调整测试逻辑,在跨应用域执行的代码内部处理
SqlCeException,避免将该异常抛出到外部应用域。
内容的提问来源于stack exchange,提问作者samann
相关产品推荐
相关产品推荐

