php unit-testing upload file-upload simpletest

¿Cómo puedo escribir pruebas para subir archivos en PHP?



unit-testing upload (4)

Estoy usando simpleTest para escribir mis pruebas de PHP. Estoy escribiendo un plugin para subir archivos y me preguntaba cómo podría estar probándolo.

Me gustaría comprobar que el archivo se haya cargado correctamente, en la carpeta correcta, que el error se haya devuelto correctamente cuando sea necesario, etc.

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


Para las pruebas unitarias (a diferencia de las pruebas funcionales), intente cargar un archivo (un archivo de texto corto) en una página de prueba, y var_dump($_FILES) y var_dump($_POST) . Entonces sabrás con qué rellenarlos (o tus simulacros).


Puede generar una carga de archivos de manera programática, por ejemplo, con la extensión de curl .

Como esto requiere que PHP se ejecute en un servidor web, no es una prueba de unidad. En consecuencia, la mejor manera sería utilizar las pruebas --POST_RAW-- y completar la sección --POST_RAW-- con los datos.

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


Según los Docs, SimpleTest tiene soporte para las pruebas de FileUpload incorporadas desde la versión 1.0.1:

File upload testing Can simulate the input type file tag 1.0.1

He revisado los ejemplos en su sitio y asumo que usaría algo similar a

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

para enviar el archivo y luego usar las aserciones regulares para verificar que la carga funcionó como se desea. Pero eso es realmente 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 preguntar en su foro de soporte sin embargo.

Pero básicamente, no sirve de mucho probar que un formulario cargue un archivo. Este es el comportamiento del navegador probado y probado. 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 primera cosa. Cree una clase FileRequest la que puede pasar la matriz $_FILES . A continuación, puede manejar la carga de la clase. Esto le permitiría probar la funcionalidad sin tener que subir un archivo. Solo configura tu instancia de FileRequest en consecuencia. Incluso puedes burlarte del sistema de archivos con vfsStreamWrapper , por lo que ni siquiera necesitas archivos reales.


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

El problema era que is_uploaded_file y move_uploaded_file no podían funcionar con estos elementos falsificados, porque en realidad no se cargan a través de POST . Lo primero que hice fue envolver esas funciones dentro de mi propio moveUploadedFile y isUploadedFile en mi complemento para que pueda burlarse de ellas y cambiar su valor de retorno.

Lo último fue moveUploadedFile la clase al probarlo y sobrescribir moveUploadedFile para usar rename lugar de move_uploaded_file y isUploadedFile para usar file_exists lugar de is_uploaded_file .