首页 > 解决方案 > Visual Studio 2019 单元测试因 InvalidProgramException 而失败

问题描述

有没有人在 Visual Studio IDE 2019 (16.9.3) 和通过 vstest.console.exe (16.9.1) 的命令行中遇到以下单元测试执行错误?

即使在安装了最新的 .NET 5.0.5 (5.0.202 SDK) 之后,也会发生这种情况

我什至尝试调试到 Newtonsoft 13.0.1 但只是发现构造函数刚刚退出并在此处抛出异常。它甚至没有在这里击中 JContainer ctor 。

相同的逻辑在运行时运行良好,但不能通过/在测试 [Fact] 函数中运行。我将其提取出来以确保它是孤立的并且不会经过任何模拟/伪造。看起来像是某处的 .NET 测试引擎?

失败的单元测试项目使用以下内容:

它是一个 .NET FW 4.6.2 目标项目,带有 .NET SDK 样式的 csproj 文件设置,而不是旧的 .NET FW 结构。

来自单元测试命令行执行的堆栈跟踪:

Error Message:
   System.InvalidProgramException : Common Language Runtime detected an invalid program.
  
Stack Trace:
   at Newtonsoft.Json.Linq.JContainer..ctor(JContainer other)
   at Newtonsoft.Json.Linq.JObject..ctor(JObject other)
   at Newtonsoft.Json.Linq.JObject.CloneToken()
   at Newtonsoft.Json.Linq.JContainer.EnsureParentToken(JToken item, Boolean skipParentCheck)
   at Newtonsoft.Json.Linq.JContainer.InsertItem(Int32 index, JToken item, Boolean skipParentCheck)
   at Newtonsoft.Json.Linq.JContainer.TryAddInternal(Int32 index, Object content, Boolean skipParentCheck)
   at Newtonsoft.Json.Linq.JContainer.Add(Object content)
   at Newtonsoft.Json.Linq.JArray.Add(JToken item)
   at at MyUnitTests.<MyTest_HasNeededData_ReturnsData>d__45.MoveNext() in XXXXXXXXXXXXXXXXXXXXXXX:line 643
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()

请帮忙!!!提前致谢。

标签: c#asp.net-corejson.netxunitvstest.console.exe

解决方案


在使用全新的测试项目进行测试后,事实证明问题是因为包含/使用了 MS Fakes 生成的 Newtonsoft.Json 程序集(似乎与版本无关,例如 Newtonsoft.Json.13.0.0.Fakes .dll)

我是靠这个假的来拦截一些测试用例的一些 Newtonsoft 扩展方法。此时,我可以删除对这个假程序集的使用/依赖,因此问题可以暂时消失。

不确定为什么会发生或确切的根本原因。我在跨多个类(通过 xUnit 集合分组)的单个线程中执行了所有测试,并且 MS Fakes 应该是线程隔离的,所以不知道交易是什么。也许我必须向 Microsoft 和 Newtonsoft 报告这件事,看看他们中的任何一个是否会承担修复任务。


推荐阅读