2011-04-09 9 views
6

Me doy cuenta cuando uso objetos falsos, PHPUnit informará correctamente el número de pruebas ejecutadas pero informará incorrectamente el número de afirmaciones que estoy haciendo. De hecho, cada vez que me burlo cuenta como otra afirmación. Un archivo de prueba con 6 pruebas, 7 afirmaciones afirmativas y cada prueba burlona una vez informó 6 pruebas, 13 afirmaciones.¿El burlarse afecta tu conteo de afirmaciones?

Aquí está el archivo de prueba con todas menos una prueba eliminada (para la ilustración aquí), además, introduje otra prueba que no resuelve localizar este problema. PHPUnit informa 2 pruebas, 3 aserciones. Elimino el maniquí: 1 prueba, 2 aserciones.

require_once '..\src\AntProxy.php'; 

class AntProxyTest extends PHPUnit_Framework_TestCase { 
    const sample_client_id = '495d179b94879240799f69e9fc868234';  
    const timezone = 'Australia/Sydney'; 
    const stubbed_ant = "stubbed ant"; 
    const date_format = "Y"; 

    public function testBlankCategoryIfNoCacheExists() { 
     $cat = ''; 
     $cache_filename = $cat.'.xml'; 
     if (file_exists($cache_filename)) 
      unlink($cache_filename); 

     $stub = $this->stub_Freshant($cat); 

     $expected_output = self::stubbed_ant; 
     $actual_output = $stub->getant(); 
     $this->assertEquals($expected_output, $actual_output); 
    } 

    public function testDummyWithoutStubbing() { 
     $nostub = new AntProxy(self::sample_client_id, '', self::timezone, self::date_format); 
     $this->assertTrue(true); 
    }  

    private function stub_FreshAnt($cat) { 
     $stub = $this->getMockBuilder('AntProxy') 
        ->setMethods(array('getFreshAnt')) 
        ->setConstructorArgs(array(self::sample_client_id, $cat, self::timezone, self::date_format)) 
        ->getMock(); 

     $stub->expects($this->any()) 
      ->method('getFreshAnt') 
      ->will($this->returnValue(self::stubbed_ant)); 

     return $stub; 
    } 
} 

Es como si se hubiera dejado una afirmación en uno de los métodos de burla del framework. ¿Hay alguna forma de mostrar cada afirmación (pasajera) que se hace?

Respuesta

8

Después de completar cada método de prueba, PHPUnit verifica la configuración de las expectativas simuladas durante la prueba. PHPUnit_Framework_TestCase::verifyMockObjects() incrementa el número de aserciones para cada objeto simulado creado. Puede anular el método para deshacer esto si realmente lo desea almacenando el número actual de aserciones, llamando al método padre y restando la diferencia.

protected function verifyMockObjects() 
{ 
    $count = $this->getNumAssertions(); 
    parent::verifyMockObjects(); 
    $this->addToAssertionCount($count - $this->getNumAssertions()); 
} 

Por supuesto, verifyMockObjects() arrojará una excepción error de aserción si cualquier expectativa no está satisfecho, por lo que necesita para detectar la excepción y volver a lanzar después de restablecer el recuento. Te lo dejo a ti. :)

+0

Entonces el comportamiento que estoy viendo es intencional. Debe haber una buena razón para que verifyMockObjects() incremente el contador de aserciones para que no lo anule. Viviré con eso, y tampoco quiero tirar basura en el código de prueba con soluciones temporales. Tal vez todos menos yo entendemos por qué es así, pero me sorprende que no haya podido encontrarla en ninguna parte. – jontyc

+1

Tiene sentido cuando usa simulaciones como parte de la prueba: "Llamar a X hará que llame a Y en el simulacro. Si no lo hace, la prueba se interrumpe". Pero cuando utilizas los simulacros como stubs para facilitar las pruebas, no es más que ruido: "Llamar a X requerirá llamar a Y, pero solo necesita' falso ', así que devuélvelo ". Al final, no uso el número de afirmaciones para nada, así que no importa. –