2012-02-21 7 views
6

Quando si utilizza PHPUnit per testare una classe che si basa sul database, il metodo getDataSet() fornisce i dati per fungere da dispositivo di test per l'intera suite di test. È fantastico, ma come si forniscono dati per un test specifico? Non è insolito, soprattutto quando si utilizzano insiemi di dati ridotti al minimo, affinché ogni test richieda dati di database diversi in cima ai dati comuni utilizzati da tutti i test. So che l'oggetto PDO è disponibile e nel nostro caso è disponibile anche l'oggetto DB nativo dell'applicazione (ovvero, possiamo eseguire query non elaborate o utilizzare altre funzionalità nell'app), ma sarebbe bello avere un modo per inserire i dati ciò viene eliminato dai contenitori DataSet di PHPUnit in modo che tutti i dati dei test vengano gestiti allo stesso modo per una maggiore chiarezza e una manutenzione più semplice.Come inserire righe di database specifiche del caso di test con PHPUnit

C'è qualche modo per realizzare questo?

risposta

4

si tratta di una risposta in ritardo, ma potrebbe ancora essere utile per alcune persone credo ...

È possibile eseguire ciò chiamando il metodo execute di un IDatabaseOperation che è possibile ottenere da PHPUnit_Extensions_Database_Operation_Factory. Fondamentalmente useresti CLEAN_INSERT o INSERT.

Come zerkms' second approach, lo chiamereste all'inizio di ogni test che necessita di dati specifici. Per esempio:

public function testA() { 
    PHPUnit_Extensions_Database_Operation_Factory::INSERT() 
    ->execute($this->getConnection(), $this->createXMLDataSet(__DIR__.'/fixtureA.xml')); 

    // Test code 
} 

Tuttavia, il vantaggio di questa soluzione è che il set di dati di tutta test case rimane invariato, quindi:

  • Metodi di prova restano indipendente una dall'altra (considerando nell'approccio di zerkms, se non si/dimentica di specificare un set di dati in un altro metodo di test, si riutilizzerebbe il set di dati dal precedente metodo (casuale?) che ha modificato il set di dati, che è abbastanza brutto e IMHO molto suscettibile di errore) . Qui, qualsiasi altro test senza tale chiamata all'inizio semplicemente userebbe il set di dati del test case come al solito.
  • È possibile creare il set di dati di test sopra il dataset comune (test case). Se si utilizza l'operazione INSERT (non CLEAN_INSERT), verranno inserite righe specifiche per il test dopo tutte le righe dal set di dati comune. È anche possibile utilizzare l'operazione DELETE per rimuovere alcune righe indesiderate dal set di dati comune.
  • BTW, non chiamando onSetUp() rende questo lavoro anche se l'operazione di impostazione del test case è stata modificata.
8

Si potrebbe seguire tale sporco trucco:

protected function getDataSet() 
{ 
    if (in_array($this->getName(), array('testA', 'testB', '...'))) { 
     return $this->createXMLDataSet(__DIR__ . '/_fixtures/fistureA.xml'); 
    } 

    return $this->createXMLDataSet(__DIR__ . '/_fixtures/fixtureB.xml'); 
} 

Piccola nota: $this->getName() restituisce il nome attuale metodo di prova

Un approccio alternativo è quello di ri-run istituito operazioni è l'inizio del test:

public function testA() 
{ 
    $this->getDatabaseTester()->setDataSet($this->createFlatXMLDataSet(__DIR__ . '/_fixtures/fixtureForTestA.xml')); 
    $this->getDatabaseTester()->onSetUp(); 

    /* your test code */ 
} 
+0

Penso che sia stato molto più semplice con le versioni precedenti. Perché lo hanno reso complicato? – eddy147

+0

@ eddy147: è l'unica versione che abbia mai visto in dbunit – zerkms

+0

non dovrei usare dbunit affatto e scrivere i miei propri set di dati personalizzati dall'aspetto di esso – eddy147

Problemi correlati