Исключение адаптера модульного тестирования: невозможно загрузить один или несколько ... в ASP.NET MVC - PullRequest
4 голосов
/ 09 апреля 2009

Используя ASP.NET MVC 1.0 (текущий), я создаю новый проект ASP.NET MVC по умолчанию, используя Visual Studio 2008 на компьютере x64 (Server 2008), принимаю все значения по умолчанию, собираю и запускаю его. Помимо установки сборок System.Web. * Как «Копировать локально», он запускается и вызывает веб-приложение по умолчанию. Когда я пытаюсь запустить модульные тесты этого проекта, я получаю:

Исключение при юнит-тестировании адаптера: невозможно загрузить один или несколько запрошенных типов. Получите свойство LoaderExceptions для получения дополнительной информации ..

Теперь, если я повторю то же самое упражнение, используя VS2008 на компьютере с архитектурой x86 (Server 2003), тогда все 27 модульных тестов по умолчанию будут работать нормально. (Также мне не нужно отмечать сборки System.Web. * Как «Copy Local»)

Идеи для разрешения исключения?

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

    public class MockIdentity : IIdentity
    {
        public string AuthenticationType
        {
            get
            {
                return "MockAuthentication";
            }
        }

        public bool IsAuthenticated
        {
            get
            {
                return true;
            }
        }

        public string Name
        {
            get
            {
                return "someUser";
            }
        }
    }

    public class MockPrincipal : IPrincipal
    {
        IIdentity _identity;

        public IIdentity Identity
        {
            get
            {
                if (_identity == null)
                {
                    _identity = new MockIdentity();
                }
                return _identity;
            }
        }

        public bool IsInRole(string role)
        {
            return false;
        }
    }

    public class MockMembershipUser : MembershipUser
    {
        public override bool ChangePassword(string oldPassword, string newPassword)
        {
            return newPassword.Equals("newPass");
        }
    }

    public class MockHttpContext : HttpContextBase
    {
        private IPrincipal _user;

        public override IPrincipal User
        {
            get
            {
                if (_user == null)
                {
                    _user = new MockPrincipal();
                }
                return _user;
            }
            set
            {
                _user = value;
            }
        }
    }

Ответы [ 7 ]

3 голосов
/ 11 апреля 2009

Во-первых, вы пробовали это в конфигурации выпуска? Вы сделали чистку на вашем решении?

Вы пытались создать свой тестовый проект? Извлеките исходные файлы для ваших тестов, удалите проект из вашего решения и добавьте новый тестовый проект, который ссылается на приложение MVC. Затем повторно добавьте исходные файлы теста.

Редактировать

Являются ли классы и интерфейсы, которые вы используете и реализуете в своих тестах?

Редактировать Это ссылка на x64, а не на dll x86?

1 голос
/ 16 апреля 2009

Я не уверен в тонкостях того, что происходит с x64 verus x86, но использование пользовательских идентификаторов / принципалов может привести к некоторым интересным небольшим сбоям, особенно если используется cassini (встроенный веб-сервер vshost - который я думаю, что вы в конечном итоге использовать, выполняя локальные модульные тесты в VS). Я сталкивался с этой проблемой раньше, и вместо того, чтобы детализировать ее здесь, я выложу ссылку на полезную информацию Опять же, я не уверен, если это связано с вашей проблемой (я не являюсь гуру MVC), но прочитайте это. Пища для размышлений:

http://www.lhotka.net/weblog/UpdateOnMyStrugglesWithTheASPNETDevelopmentServer.aspx

РЕДАКТИРОВАТЬ: поэтому, в конечном итоге, это может быть проблемой сбоя сериализации, даже если этот конкретный крайний случай не имеет значения. Вы пытались пометить ваши поддельные объекты identity / iprincpal как [serializable]? Помните, что visual studio - это 32-битное приложение; возможно, тестирование его на IIS (если не на cassini) с помощью 64-битного пула приложений вызывает переключение контекста где-то, что приводит к тому, что фиктивные идентификаторы (если они назначаются в качестве идентификатора потока) маршалируют через такую ​​границу - отсутствие [ serializable], вероятно, вызовет исключение TypeLoadException.

По-прежнему ли генерируется IIS для использования 32-битного пула приложений (на вашем 64-битном сервере)?

-Oisin

1 голос
/ 12 апреля 2009

Вы пытались построить свой проект как проект x86 (Свойства проекта -> Построить -> Цель платформы) на компьютере x64?

Кроме того, вы не уверены в своем наборе инструментов для модульного тестирования, но, например, NUnit может работать как тесты как x86 или x64 (на компьютере x64). Если одна из ваших сборок обращается к какому-либо 32-битному коду (например, COM-объекту), попытка запустить их под x64 приведет к ошибке «Невозможно загрузить один или несколько запрошенных типов».

1 голос
/ 10 апреля 2009

Установлены ли у вас VS 2008 SP1 и .NET 3.5 SP1 в вашем Win2k8? По умолчанию VS 2008 установлен 3.5 Framework, но не SP1. Убедитесь, что у вас установлены и фреймворк SP1, и VS 2008 SP1.

0 голосов
/ 27 мая 2009

Это напомнило мне старый пост в блоге, который я однажды прочитал. Возможно, вы можете использовать ту же технику для устранения причины ошибки:

http://www.agileprogrammer.com/oneagilecoder/archive/2007/11/17.aspx

0 голосов
/ 17 апреля 2009

Я заметил, что некоторые типы (в частности IIdentity и IPrincipal), которые вы реализуете, не находятся в сборке System.Web.*.

Вы пытались пометить сборку System.Security.Principal как "Копировать локально"?

0 голосов
/ 17 апреля 2009

Мне интересно, будет ли более значительная разница 2k8 против 2k3, чем 64 против 32 бит. Вы создали Visual Studio в качестве администратора? Сборка может отсутствовать из-за виртуального хранилища Windows 2k8. Если это рабочий стол разработки под управлением 2k8, возможно, вы захотите отключить виртуальное хранилище, оно в вашей политике помечено как «Контроль учетных записей пользователей: виртуализация ошибок записи файлов и реестра в местоположения для каждого пользователя»

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