2008-09-16 15 views
6

Uno de los principales problemas que me impiden trabajar a toda máquina es que un gran porcentaje del código que escribo depende en gran medida de objetos COM de terceros de diferentes fuentes que también tienden a interactuar entre sí (Estoy escribiendo complementos para Microsoft Office usando varias bibliotecas de ayuda si lo necesita saber).¿Cómo hace para probar la unidad de código que interactúa con objetos COM de terceros y crea instancias de ellos?

Sé que probablemente debería usar objetos de simulación, pero ¿cómo podría hacerlo exactamente en este caso? Puedo ver que es relativamente fácil cuando solo tengo que pasar una referencia a un objeto ya existente, pero algunas de mis rutinas crean instancias de objetos COM externos y luego a veces las transfieren a algún otro objeto COM externo de una biblioteca diferente.

¿Cuál es el enfoque de mejores prácticas aquí? ¿Debo tener mi código de prueba temporalmente cambiar la información de registro COM en el registro para que el código probado ejemplifique uno de mis objetos simulados en su lugar? ¿Debería inyectar unidades de biblioteca de tipo modificado? ¿Qué otros enfoques hay?

Estaría especialmente agradecido por los ejemplos o las herramientas para Delphi, pero estaría igual de feliz con consejos más generales y explicaciones de mayor nivel también.

Gracias,

Oliver

Respuesta

6

El enfoque tradicional dice que su código de cliente debe utilizar un envoltorio, que es responsable de instanciar el objeto COM. Este envoltorio puede ser fácilmente burlado.

Debido a que tiene partes de su código instanciando los objetos COM directamente, esto realmente no encaja. Si puede cambiar ese código, puede usar el patrón de fábrica: usan la fábrica para crear el objeto COM. Puede burlarse de la fábrica para devolver objetos alternativos.

Si el objeto se accede a través de un contenedor o a través de la interfaz COM original depende de usted. Si elige simular la interfaz COM, recuerde utilizar IUnknown :: QueryInterface en su simulación, para que sepa que se ha burlado de todas las interfaces, especialmente si el objeto se pasa a algún otro objeto COM.

Como alternativa, consulte el método CoTreateAsClass. Nunca lo he usado, pero podría hacer lo que necesites.

3

Todo se reduce a 'el diseño de la capacidad de prueba'. Idealmente, no debería instanciar esos objetos COM directamente, sino que debe acceder a ellos a través de una capa de indirección que puede ser reemplazada por un objeto simulado.

Ahora, COM en sí proporciona un nivel de indirección y podría proporcionar un objeto de simulacro que proporciona un sustituto de la real, pero sospecho que sería un dolor de crear y dudo si obtendría mucha ayuda de un marco de burla existente.

+0

De acuerdo; y dado que todas las interacciones con los objetos COM (excepto las llamadas de automatización a través de IDispatch) utilizan una interfaz COM, usted solo debería poder implementarlas en su clase simulada. – rpetrich

2

Escribiría una clase de contenedor fino alrededor de su objeto COM de terceros, que tiene la capacidad de cargar un objeto de simulación en lugar del objeto COM real en la situación de prueba de la unidad. Normalmente hago esto teniendo un segundo constructor al que llamo pasar en el objeto simulado. El constructor normal acababa de cargar el objeto COM de forma normal.

artículo de Wikipedia tiene una buena introducción al tema Wikipedia artible

Cuestiones relacionadas