Модульный тест Visual Studio 2019 завершается ошибкой с исключением InvalidProgramException

#c# #asp.net-core #json.net #xunit #vstest.console.exe

Вопрос:

Кто-нибудь сталкивался с приведенной ниже ошибкой выполнения модульного теста как в 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.

Та же логика работает нормально во время выполнения, но не через/в функции test [Fact]. Я извлек его, чтобы убедиться, что он изолирован и не проходит через какие-либо подделки/подделки. Похоже, что-то с этим .Где-нибудь есть чистый тестовый движок?

В неудачном проекте модульного тестирования используется следующее:

  • xunit (2.4.1)
  • xunit.runner.visualstudio (2.4.3)
  • Институт (4.2.2)
  • mstest.тестовая работа (2.2.3)
  • Mircrosoft.NET.Test.Sdk (16.9.4)
  • Microsoft.Инструменты качества.Тестирование.Подделки (16.7.4-бета.20330.2)

Это целевой проект .NET FW 4.6.2 с настройкой файла csproj в стиле .NET SDK вместо старой структуры .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()
 

Пожалуйста, помогите!!! Заранее спасибо.

Комментарии:

1. Какую версию фреймворка вы используете? Вы упомянули net framework 4.6.2 net core 2.1 и net 5. С кардинальными изменениями все по-разному. Сначала был следующий фреймворк с версиями до 4.8, в сети были чистые ядра 1, 2 и 3, а в конце есть Чистая 5

2. Чтобы все было просто, модульный тест выполняется в рамках проекта .NET Framework 4.6.2 (но csproj настроен в стиле .NET SDK). Я упомянул .NET 5, потому что я обновил свой VS 2019 до 16.9.3, в который, похоже, включен SDK .NET 5.0.201. И, основываясь на сообщении, которое я нашел в MS Github, я обновил SDK до .NET 5.0.202, просто чтобы посмотреть, поможет ли это.

3. Что это значит в стиле sdk

4. docs.microsoft.com/en-us/dotnet/core/project-sdk/…

Ответ №1:

После тестирования с помощью совершенно нового тестового проекта выяснилось, что проблема возникла из-за включения/использования сборки Newtonsoft, сгенерированной MS Fakes.Json (кажется, независимо от версии, например Newtonsoft.Json.13.0.0.Fakes.dll)

Я полагался на эту подделку, чтобы перехватить некоторые методы расширения Newtonsoft для нескольких тестовых случаев. В настоящее время я могу удалить использование/зависимость от этой поддельной сборки, чтобы на данный момент проблема могла исчезнуть.

Не знаю, почему это произойдет или какова точная первопричина. У меня все тесты выполняются в одном потоке в нескольких классах (через группировку коллекций xUnit), и MS Fakes предполагает, что поток изолирован, поэтому не знаю, в чем дело. Возможно, мне придется сообщить об этом как Microsoft, так и Newtonsoft, чтобы узнать, возьмет ли кто-нибудь из них на себя задачу по исправлению.