2009-12-20 12 views
7

Sto iniziando a lavorare con PHPUnit con Kohana. La mia applicazione ha molti controller che semplicemente prendono dati da qualche forma, convalida e inserisce/aggiorna/cancella in/-/dal database. Come dovrei scrivere un caso di test per questo.

So che se voglio testare una funzione scrivo la funzione del fornitore di dati e confronto solo il valore restituito con quello atteso. Ma i miei dati di input (dati dai moduli) vengono passati nella variabile $_POST. Come dovrei testarlo? E dopo, dovrei controllare se i dati inseriti sono realmente nel database? Si prega di fornire alcune linee guida per quel tipo di test o collegamenti ad alcuni esempi/tutorial. Grazie.

risposta

16

Prima di tutto, se si esegue il test dalla ricezione dei dati POST ai valori di controllo nel database, questo non è più unit test: non si sta testando un componente in isolamento degli altri, ma si è testare l'integrazione di questi componenti insieme.

rende le cose più difficili da prova:

  • è necessario fornire i dati in modi più duri: non solo come parametri a un metodo, ma come parametri l'intera applicazione (che significa forgiatura dati POST, qua , per esempio)
  • si hanno più cose da verificare: non solo il valore di ritorno di un metodo, o se ha generato un'eccezione
  • hai diverse cose e forse non correlati che possono causare un guasto (problema in qualche codice PHP, problema nel database , server di database non disponibile, ...), che renderà i guasti più difficili da rintracciare per trovare la loro causa.


Si noti che non ho detto quel tipo di prove "integrazione" non è utile, btw ;-)


Eppure, forgiando la matrice $_POST è molto semplice: non si tratta di leggere -solo, e puoi memorizzare ciò che vuoi in esso.

Quindi, all'inizio del tuo test-case, nulla ti impedisce di iniettare i dati che ti servono.

+0

Grazie. Informazioni utili. –

+0

@PascalMARTIN che dire del test di caricamento dei file con 'phpunit'? – Eugene

2

Ciò che Pascal ha detto. Inoltre, tieni presente che esistono strumenti specifici per testare l'interazione a livello http/browser. È possibile utilizzare i casi di test web di SimpleTest (utilizza un browser emulato/con script). Se preferisci PhpUnit, penso che puoi facilmente usare il browser di SimpleTest da PhpUnit. Altrimenti c'è l'IDE Selenium più pesante, per il quale PhpUnit ha integrazione.

0

Sono d'accordo con Pascal che l'array $ _POST non è un array di sola lettura ed è possibile manipolarlo come richiesto. Inoltre dipende dal vostro quadro, ZendFramework fornisce il flexiblility freat per manipolare le variabili come nell'esempio nel link

http://xebee.xebia.in/2010/02/05/test-driven-development-with-zend-framework-and-phpunit/comment-page-1/#comment-3431

Ma qui si perde il vantaggio di utilizzare PHPUnit di funzione costruito come (asserzioni, dataprovider, ecc.) Ma nella maggior parte dei casi usiamo array globali $ _POST, $ _GET o $ _REQUEST e quando vediamo esempi di PHPUnit, google "Come impostare le variabili POST in PHPUnit" Come PHPUnit non dimostra MVC test case (che è un po 'di alimentazione del cucchiaio) Abbiamo bisogno di ottenere l'istanza del nostro framework e quindi possiamo giocare attorno al nostro frame lavoro e PHPUnit Anche il tuo modo di test sarà diverso per gli altri

0

Beh, devi solo impostare il post in questo modo.

$ this-> reques -> setMethod ('post') -> setPost (array ( 'param1' => 'value1', 'param2' => 'valore2' ));

spero che funziona per voi

Conservare Sorriso Kdecom