c# - 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 测试引擎?
失败的单元测试项目使用以下内容:
- xunit (2.4.1)
- xunit.runner.visualstudio (2.4.3)
- NSubstitute (4.2.2)
- mstest.testframework (2.2.3)
- 微软.NET.Test.Sdk (16.9.4)
- Microsoft.QualityTools.Testing.Fakes (16.7.4-beta.20330.2)
它是一个 .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()
请帮忙!!!提前致谢。
解决方案
在使用全新的测试项目进行测试后,事实证明问题是因为包含/使用了 MS Fakes 生成的 Newtonsoft.Json 程序集(似乎与版本无关,例如 Newtonsoft.Json.13.0.0.Fakes .dll)
我是靠这个假的来拦截一些测试用例的一些 Newtonsoft 扩展方法。此时,我可以删除对这个假程序集的使用/依赖,因此问题可以暂时消失。
不确定为什么会发生或确切的根本原因。我在跨多个类(通过 xUnit 集合分组)的单个线程中执行了所有测试,并且 MS Fakes 应该是线程隔离的,所以不知道交易是什么。也许我必须向 Microsoft 和 Newtonsoft 报告这件事,看看他们中的任何一个是否会承担修复任务。
推荐阅读
- android - 修复 java.net.ProtocolException: Expected ':status' header not present from NGINX 的问题
- node.js - 如何为 Visual Studio 2019 安装 node js 工具?
- c++ - 保存对 tbb::concurrent_unordered_map 项目的引用是否安全?
- node.js - nodejs pem 为内网 CIPHER_MISMATCH 生成 openssl 自签名证书
- python - 如何将 DataFrame 转换为嵌套的 JSON
- rest - 制作良好的 REST API 请求缓存密钥的最佳实践是什么?
- java - 如何从单独的方法打印 ArrayList?
- angular - 使用 ngFor 从数组中查找最后一个索引
- android - 在 Glide 中找不到签名()
- identityserver4 - 授权流访问和刷新令牌