2008-09-19 20 views
5

Cuando utiliza la composición, puede simular los otros objetos de los que depende su clase bajo prueba, pero cuando usa la herencia , no puede simular la clase base. (? O ¿verdad)¿Cómo pruebo la unidad de objetos heredados?

general trato de prefer composition over inheritance, pero a veces la herencia realmente parece ser la mejor herramienta para el trabajo - bueno, al menos hasta que llega a la unidad de pruebas.

Entonces, ¿cómo se prueba la herencia? ¿O simplemente lo basura como no comprobable y usa composición en su lugar?

Nota: Principalmente uso PHP y PHPUnit, así que la ayuda en ese lado es muy apreciada. Pero también sería interesante saber si hay soluciones a este problema en otros idiomas.

+0

Hay un [buen ejemplo] (http://stackoverflow.com/questions/58969/best-way-to-unit-test-a-website-with-multiple-user-types-with-phpunit#63442) para [la solución dada por munificent] (http://stackoverflow.com/questions/100795/how-do-i-unit-test-inheriting-objects#116340). Deje que la jerarquía de prueba se parezca a su jerarquía de clases. – GrGr

+0

No veo cómo sería posible burlarse de una superclase. Eso tendría que ser una función de idioma ihmo. ¿Qué estás tratando de probar exactamente? Para mí, parece que la reflexión podría ser útil para ti? – Robse

+0

Tampoco sé cómo sería posible burlarse de una clase para padres. Por eso estoy preguntando. Pero no creo que sea imposible, hay muy pocas cosas en las computadoras. –

Respuesta

4

Siempre y cuando no anule los métodos públicos de la clase principal, no veo por qué debe probarlos en todas las subclases de la misma. Pruebe los métodos en la clase principal y pruebe solo los métodos nuevos o los reemplazados en las subclases.

1

¿Por qué debería burlarse de la clase base?

¿Cómo se pueden crear clases derivadas a partir de una clase primaria inexistente?

Simplemente pruébela como de costumbre, pero tenga la clase principal.

Creo que no has contado toda la historia.

Además, las características del lenguaje supuestamente funcionan (a menos que trabaje con versiones beta más o menos), por lo que no necesita probar si el método existe realmente en una clase derivada.

3

La razón por la que utiliza objetos simulados en la composición es si los objetos reales hacen algo que no desea configurar (como enchufes, puertos seriales, obtener entrada del usuario, recuperar datos voluminosos, etc.). Siempre debe usar objetos reales siempre que sea posible. Los objetos simulados son solo para cuando el esfuerzo estimado para implementar y mantener una prueba con un objeto real es mayor que el de implementar y mantener una prueba utilizando un objeto simulado. ¡Tu clase base no debería estar haciendo algo así de elegante!

Así que no tienes que probar la herencia. Es de suponer que está utilizando el comportamiento de la clase base, de modo que simplemente evalúe la clase derivada como lo haría normalmente: los métodos de invocación tanto en la clase base como en la derivada, según corresponda para la prueba. Esto garantiza que se prueba todo el comportamiento previsto de la clase derivada.

Básicamente, (la mayoría de las veces) prueba una clase derivada como si la clase base fuera invisible.

0

No, no es así. Solo tienes que verificar que los métodos modificados hagan lo que deberían. No debe de ninguna manera afectar el comportamiento de sus métodos principales. Si sus métodos principales comienzan a fallar, significa que no cumplió las condiciones obligatorias cuando los prueba en el nivel principal.

+0

Tienes razón, ¡y eso es exactamente lo que estoy señalando también! Siempre y cuando anule un método en una subclase, TIENE que probarlo por unidad. El hecho de que llame al método padre o no importa, simplemente pruebe que el resultado del método de la subclase es el que espera, así como el método padre se comporta como usted lo desea. Además, como @metao señaló, no hay una configuración de estado adicional en su clase principal que no haya detectado en su subclase. Y si esto ocurre, entonces debería reconsiderar el uso de la composición sobre la herencia. – gizmo

+0

Acepto completamente que los métodos de las subclases no deberían afectar la forma en que se comportan los métodos de clase primaria. Es por eso que tengo evité el acceso a las variables miembro de la clase principal y solo usé su interfaz pública . Pero cuando el método de las subclases llama al método en la clase padre, cuando prueba el método de la subclase cuando pruebo el método de la subclase también termino probando el método de la clase padre. –

5

Utilice un conjunto de pruebas unitarias que refleje la jerarquía de clases. Si tiene una Base class class y una Deriva class Derived, entonces tiene clases de prueba BaseTests y derivadas de esas DerivedTests. BaseTests es responsable de probar todo lo definido en Base. DerivedTests hereda esas pruebas y también es responsable de probar todo en Derived.

Si desea probar los métodos virtuales protegidos en Base (es decir, la interfaz entre Base y sus clases descendientes) también puede tener sentido crear una clase derivada solo de prueba que pruebe esa interfaz.

Cuestiones relacionadas