#c# #visual-studio-2010 #vs-unit-testing-framework
#c# #visual-studio-2010 #vs-unit-testing-framework
Вопрос:
У меня есть библиотека классов C # .NET MyClassLibrary, которая отлично компилируется. Я пытаюсь создать для него проект модульного тестирования (используя Visual Studio Unit Testing Framework с Visual Studio 2010). В библиотеке классов действительно есть большие классы, но всякий раз, когда я запускаю даже самый простой тест против самого простого класса, я получаю следующее исключение:
Метод тестирования MyClassLibraryTest.MyClassLibraryTests.Mysimpleclassstest выдал исключение: System.Исключение TypeLoadException: не удалось загрузить тип ‘MyClassLibrary.MySimpleClass’ из сборки ‘MyClassLibrary, версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null’.
Все проекты, с которыми я имею дело, находятся в одном решении, и все они скомпилированы для .NET 4.0. Все это на 64-разрядном компьютере с Windows 7.
Вот странная часть: когда я «Запускаю» тест, я получаю указанную выше ошибку. Но когда я «Отлаживаю» тест, он выполняется нормально. Почему?
Комментарии:
1. MySimpleClass не определен в сборке или у него проблемы с загрузкой. Можете ли вы показать исходный код для этого класса?
2. Как я уже сказал, при отладке все прошло нормально. Не должно иметь значения, каково определение для MySimpleClass; ЛЮБОЙ класс из проекта не загружается в режиме выполнения. Я не могу подогнать ни один приведенный здесь код, но я предполагаю, что это проблема конфигурации сборки (или настройки visual Studio, или что-то в этом роде), а не проблема с кодом.
3. Попробуйте включить ведение журнала Fusion, чтобы увидеть, откуда загружается эта сборка.
Ответ №1:
Я просто битый час бился головой об это. Проблема заключалась в том, что у меня был проект командной строки с именем Something.exe , в котором использовался проект библиотеки классов с именем Something.dll.
Комментарии:
1. Здесь то же самое. Спасибо, Амир. Я все еще не понимаю, почему наличие . dll и .exe одинаковые, вызывающие ошибку
2. Поскольку из соображений производительности . NET runtime предполагает, что это
MyAssembly
находится либо вMyAssembly.dll
, либоMyAssembly.exe
(вместо сканирования слишком большого количества файлов). Это особенность языка, благодаря которой вы можете загрузить .exe в свое приложение как любую другую сборку (я использовал это несколько раз). Поэтому, когда . NET runtime пытается загрузить,MyAssembly
пытаетсяMyAssembly.exe
, видит, что это допустимо. СЕТЕВАЯ сборка загружает ее и не может найти соответствующий класс.3. Небольшая ошибка в последнем комментарии —
MyAssembly
уже загружено, поскольку мы выполнилиMyAssembly.exe
.
Ответ №2:
Со мной тоже случилось. В моем случае проблема возникла из-за того, что тестируемый проект и проект модульных тестов имели одинаковое имя. Если это и ваш случай, то переименуйте один из проектов и переименуйте имя выходного файла, чтобы исправить это.
Комментарии:
1. к вашему сведению: название моего проекта было другим. Но в настройках имя сборки / пространство имен по умолчанию было таким же.
2. У меня была та же проблема — я переименовал проект на другое имя, затем создал другой проект, используя старое имя. Спасибо, что указали на это!
3. @dknaack 4 года спустя все еще спасает жизни! Спасибо!
Ответ №3:
Сборка MyClassLibrary была переведена в режим x86 в диспетчере конфигурации. Изменение этого на x64 исправило это. Я действительно хотел бы, чтобы Visual Studio обнаружила это и сообщила об этом как о менее неясной ошибке.
Ответ №4:
Со мной тоже случилось. Это связано со сборкой для x64, Release и x86 режима. В моем случае я удалил папки в своей корзине (debug / release / x86 в ссылочных сборках и модульном тестировании) и повторно запустил свой модульный тест. VS2010 несколько раз сообщал об ошибке в окне вывода. Это решило проблему для меня.
Ответ №5:
Это случилось со мной, когда я пытался добавить тестовый проект с тем же именем основного проекта.
Мое основное название проекта было: Calculator.OperationsManager название моего тестового проекта было: Calculator.OperationsManager
я изменил название тестового проекта на Calculator.OperationsManager.Протестируйте, и все прошло хорошо.
Комментарии:
1. Здесь то же самое. У двух проектов было одинаковое пространство имен по умолчанию, и возникла эта проблема.
Ответ №6:
Прошел через это сегодня, и хотя я бы оставил свое исправление.
Спецификации: VS 2013 / .Net 4.0
Решение: Перейдите в меню> Тест> Настройки тестирования> Архитектура процессора по умолчанию> X64
Ответ №7:
Здесь то же сообщение, но я также не смог отладить тест.
В моем случае тестируемая мной DLL была развернута в GAC (требование BizTalk). Я создал новый класс и тестировал его, но не загружал DLL снова с момента добавления тестируемого класса.
Ответ №8:
На случай, если это поможет другим с той же ошибкой (я понимаю, что это напрямую не отвечает на вопрос re Release vs Debug); Я объединил устаревший проект с пространством имен, которое конфликтовало с существующим, поэтому переименовал его. Я получил эту ошибку при попытке создать форму из этого проекта.
Я проверил, что целевая платформа была такой же, и удалил каталоги .bin , чтобы обеспечить чистую перестройку, удалил ссылку на объединенный проект и повторно добавил его, но все та же ошибка.
В конце концов (!) Я проверил имя сборки в свойствах проекта (щелкните правой кнопкой мыши по проекту, выберите «свойства», выберите вкладку «Приложение») и изменил его, чтобы оно соответствовало пространству имен по умолчанию, и теперь все хорошо.
Ответ №9:
У меня была аналогичная проблема с Trey, но вместо BizTalk у меня есть решение SharePoint, которое также использует развертывание GAC. У GAC была более старая сборка. Когда я удалил сборку GAC, отозвав решение, тест прошел.
Комментарии:
1. Для biztalk повторное развертывание приложения (включая сборки в GAC) сработало
Ответ №10:
У меня была эта ошибка при использовании NUnit 3 в VS 2013. Я решил проблему, удалив ссылку на сборку в моем тестовом проекте для сборки, которая содержала тип, который не был найден, а затем повторно добавил ссылку.
Ответ №11:
На всякий случай, если кому-то это нужно: Я создал тестовый проект в Visual Studio и задавался вопросом, почему некоторые классы не могут быть найдены, даже если Visual Studio неоднократно просила меня добавить «System.Web» в качестве ссылки.
Я сделал это, и ошибка продолжала возникать. Проблема для меня была простой (и я должен был проверить это раньше, я знаю): Я создал тестовый проект из шаблона, который создал проект .NET Core. После изменения его на .NET Framework 4.6.1 и добавления «System.Веб » в качестве ссылки, все работало нормально.
Ответ №12:
Столкнулся с той же проблемой. На всякий случай, если это кому-нибудь поможет — мне удалось заставить его работать, понизив рейтинг пакета nuget NUnit3TestAdapter с версии 3.13.0 до 3.11.2.
Вы можете найти более подробную информацию об этом — https://github.com/nunit/nunit-console/issues/424
Ответ №13:
Это случилось и со мной. У меня был пакет nuget, установленный в моем проекте домена с версией 1.5, но в моем проекте модульного тестирования была только версия 1.1. Я решил проблему, обновив версию в проекте модульного тестирования, чтобы она соответствовала версии в проекте домена (проект, с которым тестируется).
Ответ №14:
В моем случае проблема была вызвана запутанным кодом. Я отключил запутывание кода и решил проблему.