Подтвердить что ты не робот

Visual Studio 2015 InvalidProgramException в Unit Test с подделками

Я использую Visual Studio 2015 Enterprise RTM для написания модульных тестов для проекта, который использует Unity Container.

Я обнаружил, что простой акт добавления сборки подделок для Unity, даже не использующий фальшивку, достаточен для создания этого исключения:

System.InvalidProgramException: Common Language Runtime обнаружил недопустимую программу.



Рассмотрим следующие шаги для воспроизведения:

  • Использование среды разработки Visual Studio 2015 Enterprise RTM создает проект Unit Test для таргетинга .NET 4.6

  • Добавить пакет NuGet "Единство" версия 3.5.1404.0

  • Добавить пакет NuGet "CommonServiceLocator" версия 1.2.0

  • Напишите один Unit Test так:

[TestClass]
public class UnitTest1 : IDisposable
{
    [TestMethod]
    public void TestMethod1()
    {
        new ResolvedArrayParameter<IDisposable>(new IDisposable[] {this});
    }

    void IDisposable.Dispose()
    {
    }
}
  • Проверить тестовые проходы

  • Щелкните правой кнопкой мыши ссылку Microsoft.Practices.Unity и выберите "Добавить сборку подделок"

  • Повторно запустите тест

  • Следите за следующим замечательным тестом:

Имя теста: TestMethod1
Test FullName: UnitTestProject11.UnitTest1.TestMethod1
Источник теста: c:\temp\UnitTestProject11\UnitTestProject11\UnitTest1.cs: строка 12
Результат теста: Failed
Продолжительность теста: 0: 00: 00.0572447

Результат StackTrace:

в Microsoft.Practices.Unity.ResolvedArrayParameter..ctor(Тип arrayParameterType, Тип elementType, Object [] elementValues)
   в Microsoft.Practices.Unity.ResolvedArrayParameter`1..ctor(Object [] elementValues)
   в UnitTestProject11.UnitTest1.TestMethod1() в c:\temp\UnitTestProject11\UnitTestProject11\UnitTest1.cs: строка 13
Сообщение о результатах:
Метод тестирования UnitTestProject11.UnitTest1.TestMethod1 выбрал исключение:
System.InvalidProgramException: Common Language Runtime обнаружил недопустимую программу.



Самая необычная особенность этой проблемы - очевидно, что подделкам даже не нужно появляться непосредственно в коде для отказа манифестации.

Обширный объем прокрутки показывает, что перенацеливание тестового проекта на .NET 4.5 "исправляет" проблему, которая для меня является не стартовой из-за еще одной проблемы Я опубликовал несколько недель назад.

Еще больше возиться с практически всеми настройками подделок (кодовые контракты и т.д.) не давали решения.

Любые советы по этому вопросу будут очень оценены.

4b9b3361

Ответ 1

Единственное общее решение - убедиться, что все части соответствуют версии CLR, которую вы используете очень близко, и что VS имеет последние обновления.

Для этой проблемы нет волшебной пули. Вам необходимо знать (выкапывать) точную совместимость версий CLR всех частей, которые подключены в вашем проекте, когда вы вводите подделки. Имейте в виду, что "совместимость" может быть только вопросом манифеста, но чаще всего это вопрос нюансов о том, как был/был создан окончательный код и для какой версии виртуальной машины.

Эти вещи обычно не имеют значения для запуска и отладки, так как существует несколько уровней, которые гарантируют, что незначительные различия версий либо не имеют значения, либо вы получаете бесшумный переключатель для того, что ваш код объявлен совместимым с.

Но, когда вы используете Fakes, "система" вводит исходный код в ваш (который включает в себя сторонние библиотеки), а это означает, что он пропускает большинство проверок - не может работать иначе. Но, когда придет время запускать код, движок (виртуальная машина) должен сделать некоторые проверки для его собственной безопасности/целостности, и он имеет тенденцию получать параноидальный сигнал и выручать, если он выглядит так, как декларации не соответствуют достаточно близко.

Именно по этой причине кто-то спросил, имеют ли присоединенные сборки сильные или подписанные. Это единственный уровень гарантии, что "система" действительно будет доверять. Без этого он будет делать угадывание, и в большинстве случаев это не имеет значения для обычных прогонов, если дело касается ввода кода.

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

Тот факт, что ошибки исчезли, когда вы переключили свой вкус обратно на 4.5, говорит вам, что либо некоторые из задействованных сборок не достаточно "близки" для 4.6, либо могут быть некоторые сбои с введением кода, которые были исправлены обновлениями, t взят еще.

Да, это связано с большой болью, но ценой желать быть на границе.