¿Cómo pruebo los métodos concretos de una clase abstracta con PHPUnit?
Esperaría tener que crear algún tipo de objeto como parte de la prueba. Sin embargo, no tengo idea de la mejor práctica para esto o si PHPUnit lo permite.
¿Cómo pruebo los métodos concretos de una clase abstracta con PHPUnit?
Esperaría tener que crear algún tipo de objeto como parte de la prueba. Sin embargo, no tengo idea de la mejor práctica para esto o si PHPUnit lo permite.
Respuestas:
La prueba unitaria de clases abstractas no significa necesariamente probar la interfaz, ya que las clases abstractas pueden tener métodos concretos, y estos métodos concretos pueden ser probados.
No es tan raro, cuando se escribe un código de biblioteca, tener cierta clase base que espera extender en su capa de aplicación. Y si desea asegurarse de que se prueba el código de la biblioteca, necesita medios para UT los métodos concretos de clases abstractas.
Personalmente, uso PHPUnit, y tiene los llamados trozos y objetos simulados para ayudarte a probar este tipo de cosas.
Directamente desde el manual de PHPUnit :
El objeto simulado te da varias cosas:
fuente
Buena pregunta. He estado buscando esto también.
Afortunadamente, PHPUnit ya tiene un
getMockForAbstractClass()
método para este caso, por ejemploImportante:
Tenga en cuenta que esto requiere PHPUnit> 3.5.4. Hubo un error en versiones anteriores.
Para actualizar a la versión más nueva:
fuente
Cabe señalar que a partir de PHP 7 se ha agregado soporte para clases anónimas . Esto le brinda una vía adicional para configurar una prueba para una clase abstracta, una que no depende de la funcionalidad específica de PHPUnit.
fuente
Eran, tu método debería funcionar, pero va en contra de la tendencia de escribir la prueba antes del código real.
Lo que sugeriría es que escriba sus pruebas sobre la funcionalidad deseada de una subclase no abstracta de la clase abstracta en cuestión, luego escriba tanto la clase abstracta como la subclase de implementación, y finalmente ejecute la prueba.
Obviamente, sus pruebas deben probar los métodos definidos de la clase abstracta, pero siempre a través de la subclase.
fuente
La respuesta de Nelson es incorrecta.
Las clases abstractas no requieren que todos sus métodos sean abstractos.
Los métodos implementados son los que necesitamos probar.
Lo que puede hacer es crear una clase de código auxiliar falso en el archivo de prueba de la unidad, hacer que extienda la clase abstracta e implementar solo lo que se requiere sin ninguna funcionalidad, por supuesto, y probarlo.
Salud.
fuente
Si no desea subclasificar la clase abstracta solo para realizar una prueba unitaria de los métodos que ya están implementados en la clase abstracta, puede intentar ver si su marco le permite simular clases abstractas.
fuente