2011-05-19 13 views
8

Tal vez perdí un detalle, pero escribí un pequeño caso de prueba para un método singleton _clone pero aún no aparece como se probó en el informe de cobertura del código.phpunit - @covers tag not working

/** 
    * @covers ErrorHandling::__clone 
    */ 
    public function test__cloneNotCloneable(){ 
    $class = new ReflectionClass('ErrorHandling'); 
    $method = $class->getMethod('__clone'); 

    self::assertTrue($method->isFinal(), '__clone method is not final.'); 
    self::assertTrue($method->isPrivate(), '__clone method is not private.'); 
} 

El método __clone es el habitual __clone privada/final() de un producto único regular (el mal).

/** 
    * Define __clone as final and private to dissallow cloning. 
    */ 
    private final function __clone(){} 

sé que es probablemente una exageración para las pruebas de esto, pero el informe de códigos de cobertura es una especie de la representación gráfica de un trabajo 'bien hecho'. ¿Hay alguna manera de marcar este método como cubierto en el informe de cobertura del código?

+0

me vi en el [Manual] (http://www.phpunit.de/manual/3.3/en/code-coverage-analysis.html#code-coverage-analysis.specifying-covered-methods .tables.annotaciones) que puedo usar la etiqueta @covers ClassName :: , que mostrará todos los métodos privados como cubiertos. Si hay una forma de especificar solo un método, todavía tengo curiosidad. – stefgosselin

+0

La respuesta de @David es correcta, pero te sugiero que crees solo onc trust. No tener singleton hace que probarlo sea realmente fácil;) http://butunclebob.com/ArticleS.UncleBob.SingletonVsJustCreateOne – edorian

Respuesta

12

La etiqueta @covers le dice a PHPUnit que tiene la intención de para probar el método nombrado; lo hace no marque el método como haber sido probado. Como no puede llamar al método, Xdebug no le dirá a PHPUnit que se ha ejecutado su código, y que nunca será cubierto en su informe.

Su mejor opción es decirle a PHPUnit que ignore el método en el informe utilizando la etiqueta docblock @codeCoverageIgnore.

/** 
* Define __clone as final and private to dissallow cloning. 
* 
* @codeCoverageIgnore 
*/ 
private final function __clone() { } 

se puede ignorar cualquier gama de líneas encerrándolas en un par de arranque de una línea/parada comentarios.

// @codeCoverageIgnoreStart 
private final function __clone() { } 
// @codeCoverageIgnoreEnd 

Finalmente, puede ignorar una sola línea al agregarle un comentario de una línea.

private final function __clone() { } // @codeCoverageIgnore