Testear métodos y atributos privados con PHPUnit

phpunit

Todos nos hemos preguntado como poder testear nuestros  métodos y atributos privados/protegidos con PHPUnit ya que no pueden ser accedidos directamente.

Una de las formas “tradicionales” de testearlos era crear una clase hija de la clase a testear y definir métodos publicos para acceder a ellos, pero hay miles de motivos de porque eso esta mal.

La forma de hacerlo correctamente es explicada por Sebastian Bergmann en su blog.

Para los atributos se utiliza el método assertAttributeEquals:

1
2
3
4
5
6
7
8
public function testPrivateAttr()
{
$this->assertAttributeEquals(
true, /* expected value */
'attr', /* attribute name */
new Foo /* object */
);
}

Para los métodos hay que utiliza la funcionalidad de Reflección que provee PHP

1
2
3
4
5
6
7
8
9
10
11
12
public function testPrivateMethod()
{
$method = new ReflectionMethod(
'Foo', 'doSomethingPrivate'
);

$method->setAccessible(TRUE);

$this->assertEquals(
'blah', $method->invoke(new Foo)
);
}

Fuente: Sebastian Bergmann