2010-07-11 2 views
5

Я пытаюсь сделать TDD с объектом, который имеет зависимость от COM-интерфейса. Я, хотя и об издевательском интерфейсе COM, при тестировании разработки, и делаю это на тестах интеграции.Как проверить объект, зависящий от COM, в C#

Однако, я не могу издеваться интерфейс COM, я попытался с Moq, и он бросает исключение:

System.TypeLoadException был необработанное по коду пользователя Message = Не удалось загрузить «Castle.Proxies типа .iTunesAppProxy ' из сборки' DynamicProxyGenAssembly2, Версия = 0.0.0.0, Культура = нейтраль, PublicKeyToken = null '. Тип отмечен как право на тип эквивалентности, но либо он имеет общие параметры, или это не структура, COM импортирован интерфейс, перечисление, или делегировать

Можно ли с другими системами? Как вы делаете TDD с объектами, зависимыми от COM?

Заранее спасибо! Или делегировать

+0

Какой интерфейс COM это? Каким исключением является мета-бросок? Предоставляет ли Moq это исключение на всех COM-интерфейсах или только на этом? –

+0

Ну исключением является довольно общим: System.TypeLoadException был необработанное с помощью пользовательского кода Message = Не удалось загрузить тип «Castle.Proxies.iTunesAppProxy» из сборки «DynamicProxyGenAssembly2, Version = 0.0.0.0, культура = нейтральной, PublicKeyToken = нуль ». Тип отмечен как подходящий для эквивалентности типов, но либо он имеет общие параметры, либо не является структурой, COM-интерфейсом, перечислением или делегированием. –

ответ

2

Я хотел бы предложить вам взять на себя ответственность интерфейса объекта COM, это где Dependency Inversion Принцип должен войти в игру.

Если у вас нет доступа к источнику, вам нужно будет создать собственную абстракцию, которая обертывает COM-объект, иначе вы будете иметь сторонние вызовы в вашем коде.

[EDIT]

Теперь абстракции должны быть в состоянии быть издевались. Фактическая реализация оболочки будет иметь COM-объект как отношение HAS-A.

Затем вы захотите провести интеграционный тест для реализации.

Вам необходимо обработать сам объект COM, как если бы это было похоже на механизм создания базы данных или графического рендеринга или веб-службу.

+1

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

+0

@iCe - Извините, если я не был чист. Я думал, что ты уже решил насмехаться. – Gutzofter

+0

Понял, должен работать. Также я думаю, что это более чистый подход. Спасибо –

1

ОК, я вещь не существует простой способ сделать это, не уверен, что некоторые из насмешливых рамок может издеваться COM.

Что я имею в виду мой ..

У вас есть некоторые COM-интерфейс, ISomeThing и COM объект реализует этот интерфейс CoSomeThing, это какой-то реальное осуществление. Вы должны реализовать еще один COM-компонент, который будет реализовывать один и тот же интерфейс, но на самом деле просто издевается над ним - CoSomeThingMock.

В вашем коде вы создаете экземпляр CoSomeThingMock вместо CoSomeThing и используете его.

var component = new CoSomeThingMock(); 
var testObject = new Tested(component); 
+0

Итак, если я плохо разбираюсь, вы предлагаете мне делать «ручной» макет. Может быть, это должно работать, но не оптимально. –

+0

Вы неуклонно правы .. ручной макет, это только то, что я мог себе представить. –

+0

Кто-нибудь хочет поделиться более автоматической альтернативой? В противном случае я собираюсь принять ответ от alexanderb, я пробовал вчера и полностью работает. –

5

Попробуйте установить «Вставить типы взаимодействия» в FALSE для сборки, содержащей COM-интерфейс.

+0

У меня была такая же проблема, и установка «Embed Interop Types» на FALSE помогла, спасибо. –

Смежные вопросы