2010-08-04 5 views
16

Sto usando simpleTest per scrivere i miei test PHP. Sto scrivendo un plug-in per il caricamento di file e mi chiedevo come potrei testarlo.Come posso scrivere test per il caricamento di file in PHP?

vorrei controllare che il file è stato caricato correttamente, nella cartella giusta, che l'errore siano correttamente restituito in caso di necessità, ecc

Come faccio a emulare un upload di file (attraverso la variabile $ _FILES)? Ci sono dei problemi di cui dovrei essere a conoscenza?

risposta

25

Ho trovato una soluzione alternativa. Ho spoofed l'array $_FILES con i dati di test, creato i file di test fittizi nella cartella tmp/ (la cartella è irrilevante, ma ho cercato di mantenere il valore predefinito).

Il problema era che is_uploaded_file e move_uploaded_file non potevano funzionare con questi elementi falsificati, perché non sono stati effettivamente caricati tramite POST. La prima cosa che ho fatto è stato avvolgere quelle funzioni all'interno del mio moveUploadedFile e isUploadedFile nel mio plugin in modo da poterle prendere in giro e modificare il loro valore di ritorno.

L'ultima cosa è stato quello di estende la classe quando si prova e sovrascrivendo moveUploadedFile da usare al posto di renamemove_uploaded_file e isUploadedFile da usare al posto di file_existsis_uploaded_file.

+2

Puoi mostrare uno snippet di codice? – Jhn

+2

L'ampliamento di questa risposta con il modo di prendere in giro lo spostamento di file in move_uploaded_file sarebbe molto utile. –

+0

@pixelastic Qualche possibilità che potresti mostrarci il tuo codice per questo? – Magiranu

5

È possibile generare un caricamento di file in modo programmatico con ad es. l'estensione curl.

Dal momento che questo richiede PHP in esecuzione con un web server, non è molto più di una prova di unità. Di conseguenza, il modo migliore sarebbe quello di utilizzare i test PHPT e riempire lo --POST_RAW-- section con i dati.

Se non si sa cosa inserire nel --POST_RAW--, provare a installare l'estensione di Firefox TamperData, inviare un file da Firefox e copiare e incollare i dati dal lato destro.

+0

Come hai detto, cURL non è così buono per i test unitari. Ho letto la documentazione PHPT e penso che potrebbe essere la soluzione migliore. Sfortunatamente non sono riuscito a farlo funzionare ... Ho finalmente trovato un'altra soluzione (vedi la mia risposta) – pixelastic

+0

Ho anche provato a usare PHPT e --POST_RAW-- ma non sono riuscito a farlo funzionare, come documentato qui: http://stackoverflow.com/questions/4974727/phpt-unable-to-run-sample-tests-that-use-post-raw – Ian

7

Secondo la documentazione, SimpleTest has support for FileUpload testing baked in since version 1.0.1:

File upload testing  Can simulate the input type file tag 1.0.1 

Ho guardato negli esempi al loro sito e potrebbe supporre usereste qualcosa sulla falsariga di

$this->get('http://www.example.com/'); 
$this->setField('filename', 'local path'); 
$this->click('Go'); 

per inviare il file e quindi utilizzare le asserzioni regolari per verificare che il caricamento funzioni come desiderato. Ma questa è solo un'ipotesi, dato che non ho familiarità con SimpleTest e non sono riuscito a trovare un esempio nella loro homepage. Si potrebbe desiderare di ask in their support forum though.

Ma in fondo, non c'è molto di test uso che una forma di caricare un file. Questo è un comportamento del browser provato e testato. Testare il codice che gestisce il caricamento ha più senso. Non so come hai implementato il tuo codice FileUpload, ma se dovessi implementarlo, mi libererei della dipendenza dall'array $_FILES come prima cosa. Creare una classe FileRequest in cui passare l'array $_FILES. Quindi puoi gestire il caricamento dalla classe. Ciò consentirebbe di testare la funzionalità senza effettivamente caricare un file. Basta configurare l'istanza di FileRequest di conseguenza. Potresti persino prendere in giro il filesystem con vfsStreamWrapper, quindi non hai nemmeno bisogno di file reali.

+0

Voglio essere in grado di testare solo piccole parti del mio plugin. Fare una richiesta completa non mi darà il livello di dettaglio di cui ho bisogno. – pixelastic

-3

Per il test dell'unità (al contrario del test funzionale) provare a caricare un file (un breve file di testo) in una pagina di prova e var_dump($_FILES) e var_dump($_POST). Allora sai cosa popolarli (o i tuoi scherzi) con.

+4

is_uploaded_file continuerà a fallire –