Estoy tratando de probar si se llama a un método protegido en una interfaz pública.Probando si se llamó a un método protegido
<?php
abstract class SomeClassAbstract
{
abstract public foo();
public function doStuff()
{
$this->_protectedMethod();
}
protected function _protectedMethod();
{
// implementation is irrelevant
}
}
<?php
class MyTest extends PHPUnit_Framework_TestCase
{
public function testCalled()
{
$mock = $this->getMockForAbstractClass('SomeClass');
$mock->expects($this->once())
->method('_protectedMethod');
$mock->doStuff();
}
}
Sé que se llama correctamente, pero PHPUnit dice que nunca se llamó.
Lo mismo sucede cuando pruebo la inversa, cuando un método es Nunca llamada:
<?php
abstract class AnotherClassAbstract
{
abstract public foo();
public function doAnotherStuff()
{
$this->_loadCache();
}
protected function _loadCache();
{
// implementation is irrelevant
}
}
<?php
class MyTest extends PHPUnit_Framework_TestCase
{
public function testCalled()
{
$mock = $this->getMockForAbstractClass('AnotherClass');
$mock->expects($this->once())
->method('_loadCache');
$mock->doAnotherStuff();
}
}
El método se llama, pero PHPUnit dice que no lo es.
¿Qué estoy haciendo mal?
Editar I había't declarar mis métodos con dos puntos dobles, que era sólo para denotar que era un método público (interfaz). Actualizado a declaraciones de clases/métodos completos.
Editar 2 que debería haber dicho que estoy probando algunas implementaciones del método en una clase abstracta (editado el código para reflejar esto). Como no puedo crear una instancia de la clase, ¿cómo puedo probar esto?
Estoy pensando en crear un SomeClassSimple
extendiendo SomeClassAbstract
y probando este en su lugar. ¿Es el enfoque correcto?
Gracias Ewan, tienes razón.Por supuesto, si se trata de un objeto simulado, no tiene la implementación del método. Qué tonto yo. Marcaré tu respuesta como correcta. Si puedes, por favor, mira mi segunda edición. –
Entonces, lo que intento probar es la implementación, no el comportamiento, ¿no? Es un poco más claro para mí, gracias. –
La prueba de unidad es, creo, más de un arte de lo que parece. Lo aprecié más después de leer Patrones de prueba xUnit: Refactoring Test Code por Gerard Meszaros. A su vez, el libro fue una fuerte recomendación de Sebastian Bergmann, el autor de PHPUnit. –