unit testing - unit - Prueba de clases abstractas
unit test.net core (6)
Buena pregunta. He estado buscando esto también.
Afortunadamente, PHPUnit ya tiene el método getMockForAbstractClass()
para este caso, por ejemplo
protected function setUp()
{
$stub = $this->getMockForAbstractClass(''Some_Abstract_Class'');
$this->_object = $stub;
}
Importante:
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:
sudo pear channel-update pear.phpunit.de
sudo pear upgrade phpunit/PHPUnit
¿Cómo pruebo los métodos concretos de una clase abstracta con PHPUnit?
Esperaría que tuviera que crear algún tipo de objeto como parte de la prueba. Sin embargo, no tengo idea de cuál es la mejor práctica para esto o si PHPUnit lo permite.
Cabe señalar que a partir de PHP 7 se ha agregado soporte para clases anónimas . Esto le proporciona una vía adicional para configurar una prueba para una clase abstracta, una que no dependa de la funcionalidad específica de PHPUnit.
class AbstractClassTest extends /PHPUnit_Framework_TestCase
{
/**
* @var AbstractClass
*/
private $testedClass;
public function setUp()
{
$this->testedClass = new class extends AbstractClass {
protected function abstractMethod()
{
// Put a barebones implementation here
}
};
}
// Put your tests here
}
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 escribir sus pruebas sobre la funcionalidad deseada de una subclase no abstracta de la clase abstracta en cuestión, luego escribir tanto la clase abstracta como la subclase de implementación, y finalmente ejecutar la prueba.
Sus pruebas obviamente deberían probar los métodos definidos de la clase abstracta, pero siempre a través de la subclase.
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 debemos probar.
Lo que puedes hacer es crear una clase de stub 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 probar eso.
Aclamaciones.
Las pruebas unitarias de clases abstractas no necesariamente significan 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, al escribir un código de biblioteca, tener cierta clase base que espera extender en su capa de aplicación. Y si quiere asegurarse de que el código de la biblioteca esté probado, necesita los medios para UT los métodos concretos de las clases abstractas.
Personalmente, utilizo PHPUnit, y ha llamado stubs y simulacros de objetos para ayudarte a probar este tipo de cosas.
Directamente del manual de PHPUnit :
abstract class AbstractClass
{
public function concreteMethod()
{
return $this->abstractMethod();
}
public abstract function abstractMethod();
}
class AbstractClassTest extends PHPUnit_Framework_TestCase
{
public function testConcreteMethod()
{
$stub = $this->getMockForAbstractClass(''AbstractClass'');
$stub->expects($this->any())
->method(''abstractMethod'')
->will($this->returnValue(TRUE));
$this->assertTrue($stub->concreteMethod());
}
}
El objeto falso le da varias cosas:
- no es necesario que tenga una implementación concreta de la clase abstracta, y puede salirse con un trozo en su lugar
- puede llamar a métodos concretos y afirmar que funcionan correctamente
- si el método concreto se basa en el método no implementado (abstracto), puede resguardar el valor de retorno con el método will () PHPUnit
Si no quiere subclasificar la clase abstracta solo para realizar una prueba unitaria sobre los métodos que ya están implementados en la clase abstracta, podría intentar ver si su marco le permite mock clases abstractas.