2012-02-25 17 views
9

Me preguntaba si puedo verificar si una 'clase' tiene una función. assertClassHasAttribute no funciona, es normal ya que una Función no es un Atributo.How PHPUnit assertFunction

+2

por qué le gustaría probar eso? – Gordon

+0

Es útil cuando realizo algunas refactorizaciones ... Tener que SABER, mediante pruebas, que los métodos que contienen mis clases me ayudan cuando tengo que transferir un método a otra clase por alguna razón: como para desvincular responsabilidades, etc. – HexaGridBrain

+0

Discuto que nunca tendrá necesidad de esto cuando solo se asegure de que las dependencias sean burladas/tropezadas adecuadamente y tenga su API pública completamente cubierta. – Gordon

Respuesta

32

Cuando no hay un método afirmación proporcionada por PHPUnit que sea crear o utilizar una de las afirmaciones de nivel inferior con un mensaje detallado:

$this->assertTrue(
    method_exists($myClass, 'myFunction'), 
    'Class does not have method myFunction' 
); 

assertTrue() es tan básico que se puede obtener. Permite una gran flexibilidad porque puede usar cualquier función php incorporada que devuelva un valor bool para su prueba. En consecuencia, cuando falla la prueba, el mensaje de error/falla no es útil en absoluto. Algo así como Failed asserting that <FALSE> is TRUE. Es por eso que es importante pasar el segundo parámetro a assertTrue() que detalla por qué falló la prueba.

7

Pruebas de unidad e integración son para probar comportamientos que no se repiten cuál es la definición de clase.

Por lo tanto, PHPUnit no proporciona dicha afirmación. PHPUnit puede afirmar que sea una clase tiene un nombre de X, que una función devuelve el valor somthing, pero se puede hacer lo que quiere usando:

/** 
* Assert that a class has a method 
* 
* @param string $class name of the class 
* @param string $method name of the searched method 
* @throws ReflectionException if $class don't exist 
* @throws PHPUnit_Framework_ExpectationFailedException if a method isn't found 
*/ 
function assertMethodExist($class, $method) { 
    $oReflectionClass = new ReflectionClass($class); 
    assertThat("method exist", true, $oReflectionClass->hasMethod($method)); 
} 
+0

impresionante. esto suena perfecto para mi necesidad. Gracias @MounaCheikhna – shan