【问题标题】:Invalid cast exception Xunit deserialization error无效的强制转换异常 Xunit 反序列化错误
【发布时间】:2020-06-09 11:09:59
【问题描述】:

当尝试通过 Visual Studio 运行使用 xunit 框架的测试用例时,我目前收到以下错误。

System.InvalidCastException
  HResult=0x80004002
  Message=Specified cast is not valid.
  Source=xunit.execution.desktop
StackTrace:
   at Xunit.Serialization.XunitSerializationInfo.GetValue[T](String key) in C:\Dev\xunit\xunit\src\common\XunitSerializationInfo.cs:line 40
   at Xunit.Sdk.XunitTestCase.Deserialize(IXunitSerializationInfo data) in C:\Dev\xunit\xunit\src\xunit.execution\Sdk\Frameworks\XunitTestCase.cs:line 177
...

我是团队中唯一在运行测试时看到此错误的人,我已强制深度刷新我的代码存储库并重新安装了许多东西,但此问题仍然存在。

我们最近将 xunit 框架从 2.3.1 升级到了 2.4.1。我已经尝试将组件降级回 2.3.1,这让我可以再次运行测试,但是为什么这个问题只影响到我仍然是个谜。

【问题讨论】:

  • 没有任何代码,我们无法为您提供帮助。
  • 您尝试过干净的构建吗?当您更新框架版本时,编译依赖项并不总是重新编译所有代码。框架的变化需要重新编译所有代码。
  • @jdweng 是的,尝试过,但没有成功。这个自我回答的问答是希望它能帮助那些不幸遇到这个烦人问题的人,或者至少给他们一些探索的途径。

标签: c# deserialization xunit xunit.net xunit2


【解决方案1】:

好的!所以。

反序列化错误可能很棘手,但简要说明序列化和反序列化很重要。

简而言之,序列化过程是在内存中获取一个对象,然后将其放入一个函数中,这样该函数的输出就可以轻松(并且紧凑地)传递给程序外部的系统。序列化的一种形式是在保存简单游戏时,将游戏状态序列化并保存到文件中。反序列化是函数的逆过程,您在内存中获取一些表示您想要的对象的数据,并通过一个函数运行它,该函数创建具有所有所需值的对象。

我敢打赌,问题是由于您的序列化和反序列化过程不匹配(彼此不相反),或者由于您使用的序列化过程可能会导致代码更改出现问题。

例如,xunit.runner.visualstudio 包改变了一些序列化过程。在大多数情况下这很好,因为它也会处理反序列化,但是,例如,如果它的序列化过程是一个平面键值字典,那么任何名称冲突都可能导致反序列化失败。 既然您提到 xunit 组件已更新,那么我敢打赌这些更新已经开始使用您已经在测试类中使用的变量名。

这并不能完全解释为什么只有您看到问题而没有其他团队成员,因为我想您的包也在您的源代码控制中。它可能就像您的测试框架进程运行的顺序一样简单,但由于您的机器特有的多种因素,您会变得不走运。

您的错误的解决方案:

  • 更新您自己的代码库以避免名称冲突。使用 VS 进行调试可以帮助您查看序列化对象并注意任何重复的键条目。
  • 使用不同的测试运行程序包(即不是xunit.runner.visualstudio)。

【讨论】:

  • Microsoft 通常不考虑向前/向后兼容性。序列化使用类中的属性,包括基类和构造函数。因此,当 Net 版本更改时对类的任何微小更改都可能导致反序列化在使用不同版本的 Net 进行序列化时失败。和上面的 OP 说的一样,但更简洁一些。
猜你喜欢
  • 2012-02-20
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2015-01-27
  • 2012-09-20
相关资源
最近更新 更多