En mi aplicación django, tengo una vista que logra la carga de archivos. El fragmento de código central es así
...
if (request.method == 'POST'):
if request.FILES.has_key('file'):
file = request.FILES['file']
with open(settings.destfolder+'/%s' % file.name, 'wb+') as dest:
for chunk in file.chunks():
dest.write(chunk)
Me gustaría probar la vista unitariamente. Estoy planeando probar la ruta feliz así como la ruta fallida ... es decir, el caso donde request.FILES
no tiene un 'archivo' clave, caso donde request.FILES['file']
tiene None
...
¿Cómo configuro los datos de la publicación para el camino feliz? ¿Alguien puede decírmelo?
django
unit-testing
file-upload
demonio
fuente
fuente
Respuestas:
De los documentos de Django en
Client.post
:fuente
integration test
bien, en realidad no importa hasta que ingrese a bases de código más complejas, tal vez incluso con un equipo de prueba realSolía hacer lo mismo,
with open('some_file.txt') as fp:
pero luego necesitaba imágenes, videos y otros archivos reales en el repositorio y también estaba probando una parte de un componente central de Django que está bien probado, así que actualmente esto es lo que he estado haciendo:En Python 3.5+ necesitas usar
bytes
object en lugar destr
. Cambiar"file_content"
ab"file_content"
Ha funcionado bien,
SimpleUploadedFile
crea unInMemoryFile
archivo que se comporta como una carga normal y puede elegir el nombre, el contenido y el tipo de contenido.fuente
"file_content"
debe ser un encabezado de imagen válido para que su código crea que es una imagen válida.Te recomiendo que eches un vistazo a Django RequestFactory . Es la mejor manera de simular los datos proporcionados en la solicitud.
Dicho esto, encontré varios defectos en tu código.
Por lo tanto, te recomiendo que refactorices tu vista para usar una función como:
Y burlarte de eso. Puede utilizar Python Mock .
PD: También podrías usar Django Test Client Pero eso significaría que estás agregando otra cosa más para probar, porque ese cliente hace uso de Sessions, middlewares, etc. Nada similar a Unit Testing.
fuente
profile_picture
que usa internamente unaupload_profile_picture
función. Si desea probar esa vista, simplemente simule la función interna y asegúrese de que se llame en su prueba. Este es un ejemplo simple: gist.github.com/santiagobasulto/6437356Hago algo como esto para mi propia aplicación relacionada con eventos, pero debería tener código más que suficiente para continuar con su propio caso de uso
fuente
Hice algo como eso:
La función create_image creará una imagen, por lo que no es necesario que proporcione una ruta estática de la imagen.
Nota: Puede actualizar el código según su código. Este código para Python 3.6.
fuente
En Django 1.7 hay un problema con TestCase que se puede resolver usando open (filepath, 'rb') pero cuando usamos el cliente de prueba no tenemos control sobre él. Creo que probablemente sea mejor asegurarse de que file.read () devuelva siempre bytes.
fuente: https://code.djangoproject.com/ticket/23912 , por KevinEtienne
Sin la opción rb, se genera un TypeError:
fuente
fuente
Como se menciona en la documentación oficial de Django :
Más información: ¿Cómo comprobar si el archivo se pasa como argumento a alguna función?
Durante las pruebas, a veces queremos asegurarnos de que el archivo se pase como argumento a alguna función.
p.ej
En las pruebas, use el simulacro de Python algo como esto:
fuente
Espero que esto ayude.
fuente
Estoy usando Python == 3.8.2, Django == 3.0.4, djangorestframework == 3.11.0
Lo intenté
self.client.post
pero obtuve unaResolver404
excepción.Lo siguiente funcionó para mí:
fuente