2010-08-04 12 views
16

Estoy usando test simple para escribir mis pruebas de PHP. Estoy escribiendo un complemento de carga de archivos y me preguntaba cómo puedo probarlo.¿Cómo puedo escribir pruebas para subir archivos en PHP?

me gustaría comprobar que el archivo se carga correctamente, en la carpeta correcta, que el error se devuelve correctamente cuando sea necesario, etc.

¿Cómo emular una carga de archivos (a través de la variable $ _FILES)? ¿Hay algún problema que deba tener en cuenta?

Respuesta

25

He encontrado una solución alternativa. He falsificado la matriz $_FILES con datos de prueba, he creado archivos ficticios de prueba en la carpeta tmp/ (la carpeta es irrelevante, pero traté de mantener el valor predeterminado).

El problema era que is_uploaded_file y move_uploaded_file no podían funcionar con estos elementos falsificados, porque realmente no se cargaban a través de POST. Lo primero que hice fue incluir esas funciones dentro de mi propio moveUploadedFile y isUploadedFile en mi complemento para poder burlarme de ellos y cambiar su valor de retorno.

Lo último fue a la clase extiende al probar y sobrescribir moveUploadedFile utilizar rename en lugar de move_uploaded_file y isUploadedFile utilizar file_exists en lugar de is_uploaded_file.

+2

¿Puedes mostrar un fragmento de código? – Jhn

+2

Expandir esta respuesta con la forma de simular el movimiento de archivos en move_uploaded_file sería muy útil. –

+0

@pixelastic ¿Alguna posibilidad de que nos muestres tu código para eso? – Magiranu

5

Puede generar una carga de archivos de forma programática, como p. Ej. la extensión curl.

Dado que esto requiere que PHP se ejecute en un servidor web, no se trata de una prueba unitaria. En consecuencia, la mejor manera sería utilizar pruebas de PHPT y llenar el --POST_RAW-- section con los datos.

Si no sabe qué poner en el --POST_RAW--, intente instalar la extensión TamperData Firefox, envíe un archivo desde Firefox y copie y pegue los datos desde el lado derecho.

+0

Como dijiste, cURL no es tan bueno para las pruebas unitarias. Leí la documentación de PHPT y creo que esa podría ser la mejor solución. Desafortunadamente no logré que funcionara ... Finalmente encontré otra solución (ver mi respuesta) – pixelastic

+0

También intenté usar PHPT y - POST_RAW-- pero tampoco pude hacerlo funcionar, como se documenta aquí: http://stackoverflow.com/questions/4974727/phpt-unable-to-run-sample-tests-that-use-post-raw – Ian

7

De acuerdo con la Docs, 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 

He mirado a través de los ejemplos en su sitio y de suponer que tendría que utilizar algo en la línea de

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

para enviar el archivo y luego use las aserciones regulares para verificar que la carga funcionó como se quería. Pero eso es solo una suposición descabellada, ya que no estoy familiarizado con SimpleTest y no pude encontrar un ejemplo en su página de inicio. Es posible que desee ask in their support forum though.

Pero, básicamente, no hay muchas pruebas de uso que un formulario carga un archivo. Este es un comportamiento probado del navegador. Probar el código que maneja la carga tiene más sentido. No sé cómo implementó su código FileUpload, pero si tuviera que implementar esto, me desharía de la dependencia de la matriz $_FILES como la primera cosa. Cree una clase FileRequest a la que pueda pasar la matriz $_FILES. Entonces puedes manejar la carga de la clase. Esto le permitiría probar la funcionalidad sin cargar realmente un archivo. Simplemente configure su instancia de FileRequest en consecuencia. Incluso podría burlarse del sistema de archivos con vfsStreamWrapper, por lo que ni siquiera necesita archivos reales.

+0

Quiero ser capaz de probar solo pequeñas fracciones de mi plugin. Hacer una solicitud completa no me proporcionará el nivel de detalle que necesito. – pixelastic

-3

Para probar la unidad (a diferencia de las pruebas funcionales) intente cargar un archivo (un archivo de texto breve) en una página de prueba, y var_dump($_FILES) y var_dump($_POST). Entonces sabes con qué poblarlos (o tus burlas).

+4

is_uploaded_file aún fallará –

Cuestiones relacionadas