Исключение nUnit на 64-битной машине - PullRequest
7 голосов
/ 29 сентября 2011

У меня есть приложение MVC 3.0.Мой тестовый фреймворк nUnit 2.4.8.0.Я запустил этот код на 32-битной машине, а недавно начал использовать 64-битную машину.Я недавно обновил проект до .NET 4.0.

Мое приложение работает нормально - я могу соответствующим образом гидрировать свои объекты из базы данных.Проблема заключается в том, что я запускаю свои интеграционные тесты.

Тесты не пройдены и дают исключение, которого я никогда раньше не видел:

NHibernate.ADOException : cannot open connection
  ----> System.BadImageFormatException : An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

Я искал в Интернете это исключение - этоконечно, проблема с nUnit, несмотря на исключение NHibernate (помните, NHibernate позволяет мне увлажнять и сохранять объекты при запуске приложения).

Я обновил сборку nUnit до самой последней версии, версии 2.5.10и обновил ссылку в проекте на сборку в папке «net-2.0» zip-файла nUnit.Я снова провел тесты и получил то же исключение.

Похоже, что между сборками, кодом и сервером разработки ASP.NET существует какой-то тип 32-разрядного и 64-разрядного конфликта.

У меня нет опыта работы с32-битные и 64-битные проблемы, поэтому я не знаю, есть ли другие вопросы о переполнении стека, которые актуальны (те, которые я видел, похоже, не имеют)У меня есть идеи, но нет ответов:

  • Нужна ли другая сборка nUnit?
  • Нужно ли менять настройку Solution Platform в VS2010?(В настоящее время он работает на «Любой процессор»)
  • Нужно ли менять свойства сборки моего проекта интеграционных тестов?
  • Нужно ли менять настройки конфигурации моего решения?

К сожалению, у меня нет 32-битной машины для тестирования кода в данный момент.Находятся ли какие-либо из приведенных выше вопросов на правильном пути решения этой проблемы?Можете ли вы предложить какие-либо рекомендации?

Спасибо.

ОБНОВЛЕНИЕ: Я действительно надеюсь, что смогу запустить тесты из Visual Studio с помощью TestDriven.NET.Я не хочу начинать использовать пользовательский интерфейс nunit для запуска моих тестов.

ОБНОВЛЕНИЕ 2: Извините, возможно, я не совсем уверен.Я еще не использую TestDriven.NET, я сказал, что надеюсь его использовать, но я еще не установил его на новый компьютер x64.В данный момент я пытаюсь запустить тесты, щелкнув визуальный значок в Visual Studio IDE, как показано на рисунке ниже:

nunit test fixtures

Выполнение этого действиятесты не пройдены, и всплывающее диалоговое окно отображает следующее:

Failed tests

Это исключение, которое я цитировал выше.Нет ссылки на сборки, которые еще не загружены.

Сначала я не верил, что используемая мной версия NHibernate (2.0.1.4000) будет иметь значение;Я говорю это потому, что провайдеры могут возвращать нужные объекты из базы данных при запуске приложения.Однако, когда я отлаживаю тест, я вижу, что в моем провайдере выдается исключение.При копании немного, кажется, источником этого является моя сборка SQLite.Но опять же, это та же сборка, которая работает при запуске проекта - почему он не будет работать при запуске интеграционных тестов?

exception details

Ответы [ 3 ]

4 голосов
/ 29 сентября 2011

nUnit-x86.exe - это 32-разрядный исполняемый файл, а nUnit.exe - 64-разрядный. Так что используйте 32-битный исполняемый файл, чтобы увидеть, решает ли это что-то.

Используйте AnyCPU для DLL. Это - установка для exe, который загружает dll, который вызывает эту проблему. (32-битный exe не может загрузить 64-битные dll или наоборот).

1 голос
/ 29 сентября 2011

Это проблема, которую я получаю регулярно.

System.Data.SQLite - это 32- или 64-битная сборка, которая объединяет собственный образ для SQLite внутри DLL. Тестер NUnit пытается запустить его в неправильном режиме, то есть в 64-битной сборке в 32-битном тестере, и он срывается, когда пытается выполнить собственный вызов API-интерфейса SQLite C. Windows не может этого сделать.

Я предлагаю вам стандартизировать на всех платформах 32-битную или 64-битную, т.е. вашу среду разработки и среду развертывания.

Промежуточным исправлением будет замена библиотеки SQLite на 64-битную, доступную здесь: http://system.data.sqlite.org/. это может, однако, сломаться во время развертывания, после чего вам потребуется создать конфигурацию сборки для вашего живая среда, которая поставляет правильную версию DLL (32/64-bit).

Получение NUnit для детерминированного запуска в 32- или 64-битном режиме - это боль, поэтому я не стал бы беспокоиться об этом лично.

0 голосов
/ 16 августа 2013

Из ваших снимков экрана видно, что вы используете тестовый запуск Resharper.

По моему опыту, исполнитель тестов Resharper использует соответствующую битность, как указано в тестовой сборке, загружаемой в хост-среде.

Таким образом, если у вас есть проект в тестируемом стеке, который зависит от32-битное (то есть x86) что-то (например, тестируемый проект для сборки как x86 в текущей конфигурации сборки или проект со ссылкой на сборку, помеченную как x86), тогда вы бы хорошо отметили все, что потребляетэта штука (включая тестовые проекты) для сборки в виде x86.

Запуск тестового проекта, настроенного для сборки в виде x86, с помощью инструмента для выполнения тестов Visual Studio Resharper загружается в 32-разрядном процессе и успешно запускает тесты в сборкеэто также помечено как x86.

Ах, проблемы поддержки нескольких платформ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...