2010-07-11 12 views
5

Estoy tratando de hacer TDD con un objeto que tiene una dependencia en una interfaz COM. Pensé en burlarme de la interfaz COM, mientras hacía pruebas de desarrollo, y hacerlo real en las pruebas de integración.Cómo probar un objeto dependiente de COM en C#

Sin embargo, no puedo burlarse de la interfaz COM, he intentado con Moq, y se emite una excepción:

System.TypeLoadException era controlada por código de usuario Mensaje = No se pudo cargar el tipo 'Castle.Proxies .iTunesAppProxy ' del ensamblado' DynamicProxyGenAssembly2, Versión = 0.0.0.0, Culture = neutral, PublicKeyToken = null '. El tipo se marcado como elegibles para el tipo equivalencia, pero tampoco tiene genéricos parámetros, o no es una estructura, COM importada interfaz, enumeración, o delegar

¿Es posible con otros marcos? ¿Cómo se hace TDD con objetos dependientes de COM?

Gracias de antemano! O delegar

+0

Qué interfaz COM es? ¿Qué excepción es Moq lanzando? ¿Moq lanza esta excepción en todas las interfaces COM, o solo esta? –

+0

Bueno, la excepción es bastante genérico: System.TypeLoadException era controlada por el código de usuario Mensaje = No se pudo cargar el tipo 'Castle.Proxies.iTunesAppProxy' del ensamblado 'DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null '. El tipo se marca como elegible para la equivalencia de tipo, pero tiene parámetros genéricos o no es una estructura, interfaz importada COM, enumeración o delegado. –

Respuesta

2

Yo sugeriría que se tome la propiedad de la interfaz del objeto COM, aquí es donde Dependencia Inversión Principio entraría en juego.

Si no tiene acceso a la fuente, tendrá que crear su propia abstracción que envuelva el objeto COM; de lo contrario, tendrá llamadas de terceros en todo su código.

[EDIT]

Ahora la abstracción debe ser capaz de ser burlado. La implementación real del contenedor tendrá el objeto COM como una relación HAS-A.

Querrá tener una prueba de integración para la implementación.

Necesita tratar el objeto COM como si fuera algo similar a una base de datos o un motor de representación gráfica o un servicio web.

+1

Sin embargo, para hacer pruebas usando mi objeto contenedor aún necesito satisfacer la dependencia entre el contenedor y la interfaz COM, por lo tanto, todavía tengo que simularlo. –

+0

@iCe - Lo siento si no estaba claro. Pensé que ya habías decidido burlarte. – Gutzofter

+0

Entendido, debería funcionar. También creo que este es un enfoque más limpio. Gracias –

1

OK, lo que no hay una forma sencilla de hacer eso, no estoy seguro de que algunos de los marcos burlones podría burlarse COM.

Lo que tengo en mi mente ..

Usted tiene alguna de las interfaces COM, y ISomeThing objeto COM implementa esta interfaz CoSomeThing, esto alguna aplicación real. Debería implementar otro componente COM, que implementaría la misma interfaz, pero en realidad solo burlarse de él: CoSomeThingMock.

En su código crea una instancia de CoSomeThingMock, en lugar de CoSomeThing y úselo.

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

Entonces, si no entiendo bien, me estás sugiriendo que haga un simulacro "manual". Quizás eso debería funcionar, pero no es óptimo. –

+0

Usted no merece la pena .. manual de simulacro, es solo algo que podría imaginarse para esto .. –

+0

¿Alguien quiere compartir una alternativa más automática? De lo contrario, voy a aceptar la respuesta de alexanderb, intenté ayer y estoy trabajando plenamente. –

5

Intente configurar "Insertar tipos de interoperabilidad" en FALSO para el ensamblaje que contiene la interfaz COM.

+0

Tuve el mismo problema, y ​​configurar "Insertar tipos de interoperabilidad" en FALSE ayudó, gracias. –

Cuestiones relacionadas