2012-03-03 6 views
12

He la siguiente lógica en mi opinión:Django - cómo hacer pruebas unitarias de una solicitud posterior usando request.FILES

def view_function(request): 
    if request.method == 'POST': 
     uploadform = UploadFileForm(request.POST, request.FILES) 
     if uploadform.is_valid(): 
      #do stuff 

Dónde UploadFileForm es igual a:

class UploadFileForm(forms.Form): 
    file = forms.FileField() 

estoy tratando de escribir unidad pruebas para esta vista. Buscando en la documentación de Django, la forma sugerida es la siguiente:

class test_stuffTest(TestCase): 
    def setUp(self): 
     self.client = django.test.client.Client() 
    ... 
    def test_stuff(self): 
     myfile = open('....\file.csv','r') 
     response = self.client.post('/', {'name':'file.csv','attachment':myfile}) 
     #check response 

Mi objetivo es conseguir uploadform.is_valid() para evaluar en Verdadero, por lo que puede probar el código que sigue a la validación de formularios. Cuando ejecuto la prueba anterior, uploadform.is_valid() se evalúa como False. ¿Hay algo que me falta? ¿Está el código en mi prueba agregando el archivo a request.FILES, o está haciendo algo más?

+0

Si no está seguro de lo que hay en 'request.FILES', lo más rápido es agregar agregar una declaración de impresión en su vista para ver qué está pasando. – Alasdair

+0

hmm Lo intenté pero el argumento FILES no se incluyó en la impresión. ¿Hay alguna configuración para habilitarlo? – vasek1

Respuesta

15

En los documentos, el campo de archivo se llama attachment, pero en el suyo, se llama file.

No necesita name en sus datos de publicación tampoco - eso se refiere a otro campo llamado name, no el nombre del archivo que está cargando.

intente lo siguiente:

def test_stuff(self): 
    myfile = open('....\file.csv','r') 
    response = self.client.post('/', {'file':myfile}) 
3

Tal vez me estoy perdiendo algo aquí, pero suena como un trabajo para una buena biblioteca de simulacro. Personalmente me gusta mucho Mock. Pero caigo en el campo que cree que las pruebas de la unidad deben estar libres de todas las dependencias externas (como tener un archivo llamado "file.csv" en una ubicación determinada, etc.)

+0

biblioteca ordenada. No lo sabía, pero definitivamente lo echaré un vistazo más de cerca. ¡Gracias! – vasek1

+2

Se ha anunciado que se agregará Mock a la Biblioteca de Std de Python, probablemente sea algo bueno de aprender. Aquí hay un video de Michael Foord (autor original de Mock) en los últimos años PyCon. http://blip.tv/pycon-us-videos-2009-2010-2011/pycon-2011-testing-with-mock-4899484 y también un video de una charla de la PyCon de este año que pensé que era realmente bueno. http://pyvideo.org/video/699/testing-and-django - Recomiendo revisar ambos. –

30

La forma en que la suite de django hace es:

from django.core.files.uploadedfile import SimpleUploadedFile 
f = SimpleUploadedFile("file.txt", b"file_content") 

de esta manera no es necesario crear un archivo temporal y escribir en él, y que no es necesario para burlarse de un archivo (no es tan fácil como suena).

+0

Muchas gracias. Estaba intentando utilizar Request Factory para simular el archivo entrante. Acabo de colocar su código reemplazando los valores y funcionó en el primer intento. – hectorcanto

+1

¡Gracias, me salvaste de burlarme de un archivo! Actualización para Python3 django 1.10 Tuve que colocar 'b' antes del contenido del archivo, como este' f ​​= SimpleUploadedFile ("archivo.txt", b "archivo_contenido") 'debido a TypeError –

Cuestiones relacionadas