2011-04-09 1 views
6

Mi accorgo che quando utilizzo oggetti fittizi, PHPUnit riporta correttamente il numero di test eseguiti, ma riporta erroneamente il numero di asserzioni che sto facendo. In effetti, ogni volta che faccio finta, conta come un'altra affermazione. Un file di test con 6 test, 7 affermazioni di assert e ogni test di simulazione una volta riportati 6 test, 13 asserzioni.Il mocking influisce sul conteggio delle asserzioni?

Ecco il file di test con tutti i test tranne uno rimosso (per l'illustrazione qui), inoltre ho introdotto un altro test che non esegue lo stub per rintracciare questo problema. PHPUnit riporta 2 test, 3 asserzioni. Rimuovo il manichino: 1 test, 2 asserzioni.

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; 
    } 
} 

È come se un assert fosse stato lasciato in uno dei metodi di derisione del framework. C'è un modo per mostrare che ogni asserzione (di passaggio) viene fatta?

risposta

8

Dopo che ciascun metodo di test è stato completato, PHPUnit verifica l'impostazione delle aspettative simulate durante il test. PHPUnit_Framework_TestCase::verifyMockObjects() incrementa il numero di asserzioni per ogni oggetto fittizio creato. È possibile sovrascrivere il metodo per annullare ciò, se si desidera realmente, archiviando il numero corrente di asserzioni, chiamando il metodo genitore e sottraendo la differenza.

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

Naturalmente, verifyMockObjects() un'eccezione errore di asserzione se qualsiasi aspettativa è insoddisfatto, quindi avrai bisogno di catturare l'eccezione e rigenerare esso dopo aver azzerato il conteggio. Lo lascerò a te. :)

+0

Quindi il comportamento che sto vedendo è intenzionale. Ci deve essere una buona ragione per verifyMockObjects() che incrementa il contatore di asserzioni, quindi non lo sovrascriverò. Vivrò con esso, né voglio disperdere anche il codice di prova con soluzioni alternative. Forse tutti, ma io capisco perché è così, ma sono sorpreso di non averne mai sentito parlare da nessuna parte. – jontyc

+1

Ha senso quando si usano i mock come parte del test: "Chiamare X farà in modo che richiami Y sulla simulazione, altrimenti la prova sarà interrotta." Ma quando si usano i mock come stub per rendere i test più facili, è solo rumore: "Chiamare X richiede di chiamare Y, ma ha solo bisogno di' false', quindi restituiscilo. " Alla fine, non uso il numero di asserzioni per nulla, quindi non importa. –