2012-10-11 4 views
7

Attualmente sto scrivendo test di unità per una libreria, dopo aver refactoring la logica di business dai dati, sono ora in un po 'di stato confuso su come testare ora la logica!Best practice per Data Providing - PHPUnit

Per esempio, ho un processo abbastanza complesso che viene passato da una matrice di dati, userò un fornitore di dati per questo, così posso assicurarmi che funzioni per tutti i tipi di casi.

Con i dati che sto per passare attraverso il fornitore di dati, dovrei anche passare un risultato previsto? O dovrebbe essere calcolato nel test.

Come detto, il processo per il calcolo è un processo piuttosto complicato, non proprio $a + $b.

risposta

7

Con i fornitori di dati, fornisco anche il risultato previsto. Poiché voglio che il metodo prenda gli input e restituisca un valore, non voglio implementare il calcolo due volte, poiché 1 delle implementazioni potrebbe avere un errore.

Non sto cercando di utilizzare una simulazione poiché sto verificando i metodi/funzioni in questione.

Se stiamo calcolando qualcosa in base a 4 parametri, il mio fornitore di dati passerà 5. Il primo parametro è il risultato previsto, seguito dai parametri da passare al metodo/funzione.

Da questo, la mia chiamata è piuttosto semplice:

public static function GetRemoteAddressFromWebServerDataProvider() 
{ 
    return array(
     array('127.0.0.1', NULL,   '127.0.0.1'), 
     array('127.0.0.1', '127.0.0.1', NULL), 
     ); 
} 

/** 
* @dataProvider GetRemoteAddressFromWebServerDataProvider 
*/ 
public function testGetRemoteAddressFromWebServer($Result, $HTTPXSetting, $RemoteAddress) 
{ 
    $_SERVER['HTTP_X_FORWARDED_FOR'] = $HTTPXSetting; 
    $_SERVER['REMOTE_ADDR']   = $RemoteAddress; 
    $this->assertEquals($Result, GetRemoteAddressFromWebServer()); 
} 
+2

Ancora peggio, se si implementa la logica due volte, ENTRAMBI le implementazioni potrebbero avere l'errore SAME. –

8

Per estendere l'esempio di Steven, a volte può essere utile per fornire un nome per ogni set di dati. Quando uno fallisce, PHPUnit visualizzerà il suo nome piuttosto che "data # 0" nel messaggio di errore.

public static function GetRemoteAddressFromWebServerDataProvider() 
{ 
    return array(
     'not forwarded' => array('127.0.0.1', NULL,   '127.0.0.1'), 
     'no remote address' => array('127.0.0.1', '127.0.0.1', NULL), 
    ); 
} 
+1

Grazie. È bello sapere come non ho usato i nomi. È tempo di rimettere a posto alcuni test. –