Как вы имитируете IUnityContainer?

Я пытаюсь издеваться над IUnityContainer с помощью Moq 3.0

Я получаю исключение BadImageFormatException, но не при отладке. Судя по всему, я не единственный, кто столкнулся с этой проблемой.

здесь

И это зарегистрированная проблема для Moq

здесь

Мне просто любопытно, нашел ли кто-нибудь решение ... самое близкое, что я нашел, - это хорошее решение, в котором используется RhinoMock от Роя Ошерова.

здесь

но мне очень нравится Moq! Так что я действительно не хочу переходить на Rhino Mock, но я сделаю это, если потребуется

Заранее спасибо!


person Ryan Rauh    schedule 16.03.2009    source источник
comment
У меня такая же проблема. Пожалуйста, дайте мне знать, если вы нашли решение этой проблемы.   -  person toxvaerd    schedule 23.03.2009
comment
Итак, решения пока нет? Я столкнулся с той же проблемой с 3.1 Moq на 3.5sp1.   -  person Shrike    schedule 11.06.2010


Ответы (5)


Вы этого не сделаете.

Единственная причина издеваться над контейнером - это если вы его передаете. Это антипаттерн.

Вместо этого вы хотите составить весь граф объектов в точке входа приложения или Composition Root < / а>.

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

Для своих тестов вы можете либо сконструировать тестируемый объект и передать фиктивные объекты конструктору, либо создать новый контейнер в тесте и зарегистрировать в нем фиктивные объекты.

person TrueWill    schedule 16.09.2011
comment
Согласен, задал этот вопрос, когда был молодым и нисколько ... Я также неправильно использовал контейнеры IoC. - person Ryan Rauh; 26.06.2013

Вы пробовали издеваться над UnityBaseContainer или UnityContainer вместо IUnityContainer, ala этот пост Рори Примроуз? Он имеет дело с RhinoMocks, но поскольку я думаю, что проблема связана с внутренним использованием Moq Castle, вы можете решить проблему таким образом.

person Brett Bim    schedule 09.11.2009

Вам нужен полноценный макет объекта? Не могли бы вы обойтись простым внедрением фейка? То есть, реализовать тестовый экземпляр интерфейса IUnityContainer и переопределить метод, с которым вам нужно взаимодействовать?

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

person Nathan Southerland    schedule 23.03.2009
comment
Почему этот комментарий был отклонен? Те, кто проголосовал против, пожалуйста, оставьте заметку, чтобы другие, кто последует, могли лучше учиться у SO. - person Raj; 09.11.2009
comment
Верно. Я проголосовал за компенсацию. Создание заглушки решит проблему, полностью ее избегая (использование Moq не требуется). Это законный обходной путь, и для тех, кто проголосовал против, я бы посоветовал вам рассказать, почему, для остальной части класса. - person Anderson Imes; 10.11.2009
comment
Может быть, Stackoverflowers не любят людей с сертификатами? :) - person Anderson Imes; 10.11.2009

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

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

person GraemeF    schedule 08.11.2009

Вы используете это на Win x64? Взгляните на эту страницу. Это явно наводит на мысль.

Это исключение возникает, когда формат файла библиотеки динамической компоновки (файл .dll) или исполняемого файла (файл .exe) не соответствует формату, ожидаемому средой CLR.

Кроме того, обнаружена эта запись в блоге, в которой предлагается изменить флаг компиляции с любого процессора на x86, что может помочь в этом. http://filips.net/archives/2008/01/17/getting-badimageformatexception-in-64-bit-windows/

Изменить:

Также посмотрите это ТАК ветка. Загляните также в свой диспетчер конфигурации сборки.

person Raghu    schedule 18.09.2011