delphi - privados - programacion con objetos ruby
¿Cómo se prueba el código de la unidad que interactúa con objetos COM de terceros y se crea una instancia? (3)
El enfoque tradicional dice que su código de cliente debe usar un contenedor, 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.
Alternativamente, consulte el método CoTreateAsClass . Nunca lo he usado, pero podría hacer lo que necesites.
Uno de los mayores problemas que actualmente me impiden trabajar a todo vapor en pruebas unitarias 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í (I '' m escribir complementos para Microsoft Office utilizando varias bibliotecas auxiliares si necesita saber).
Sé que probablemente debería usar objetos falsos, pero ¿cómo lo haría 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 a veces las pasan a otros objetos COM externos 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 herramientas para Delphi, pero estaría igual de feliz con los consejos más generales y las explicaciones de más alto nivel también.
Gracias,
Oliver
Escribiría una clase de envoltura delgada alrededor de su objeto COM de terceros, que tiene la capacidad de cargar un objeto simulado 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.
El artículo de wikipedia tiene una buena introducción al tema Wikipedia artible
Todo se reduce a ''diseñar para probar''. 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 sí proporciona un nivel de indirección y podría proporcionar un objeto falso que proporcionara un sustituto para el real, pero sospecho que sería un dolor de crear y dudo si obtendría mucha ayuda de un marco de burla existente. .