2014-10-10 14 views
24

Ho bisogno di testare il modello Photo della mia applicazione Django. Come posso prendere in giro l'ImageField con un file immagine di prova?Modello di prova Django con ImageField

tests.py

class PhotoTestCase(TestCase): 

    def test_add_photo(self): 
     newPhoto = Photo() 
     newPhoto.image = # ?????? 
     newPhoto.save() 
     self.assertEqual(Photo.objects.count(), 1) 
+1

[Questa domanda] (http://stackoverflow.com/questions/26141786/django-1-7-imagefield-form-validation) potrebbe avere alcune informazioni rilevanti. –

+0

Grazie, ma non riesco a capire di usarlo per risolvere il mio problema :( –

risposta

37

Per gli utenti futuri, ho risolto il problema. È possibile simulare un ImageField con un'istanza SimpleUploadedFile.

test.py

from django.core.files.uploadedfile import SimpleUploadedFile 

newPhoto.image = SimpleUploadedFile(name='test_image.jpg', content=open(image_path, 'rb').read(), content_type='image/jpeg') 
+1

perfetto, dovrebbe essere la risposta accettata. Funziona in 1.10, grazie! – Laurent

+10

Puoi mostrarmi qual è il 'image_path'? – Norak

+0

@Norak Attraverso alcuni esperimenti, ho trovato che' name' è il nome del file che vuoi usare per l'immagine che hai letto e il 'imag e_path' è il percorso della tua immagine. Ad esempio '/ percorso/a/immagine.jpg'. –

14

Dillo biblioteca finta di creare un oggetto fittizio in base alla classe File di Django

import mock 
from django.core.files import File 

file_mock = mock.MagicMock(spec=File, name='FileMock') 

e poi utilizzare per le prove di

newPhoto.image = file_mock 
+0

Grazie, ma non mi piace usare moduli di terze parti per questo scopo ... –

+0

quindi puoi aprire qualsiasi immagine arbitraria da qualsiasi posizione 'newPhoto .image = open (/path/to/foo.jpg) ' – ChillarAnand

+0

ma sempre se uso il modulo mock? –

1

Un'altra alternativa:

from django.core.files import File 

newPhoto.image = File(open(image_path)) 
+1

questo non funziona se l'immagine è fuori dalla directory MEDIA_ROOT, che dovrebbe accadere se stai provando! –

6

Soluzione:

from StringIO import StringIO 
# in python 3: from io import StringIO 
from PIL import Image 
from django.core.files.base import File 

E creare un metodo statico nella classe TestCase:

@staticmethod 
def get_image_file(name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)): 
    file_obj = StringIO() 
    image = Image.new("RGBA", size=size, color=color) 
    image.save(file_obj, ext) 
    file_obj.seek(0) 
    return File(file_obj, name=name) 

Esempio:

instance = YourModel(name=value, image=self.get_image_file()) 
+0

Grazie per la risposta. Basta notare che per python 3: 'da io import StringIO' – vabada

+0

@dabad thx per nota. Ho aggiornato la risposta. –

9

è possibile utilizzare un file temporaneo, utilizzando tempfile. Quindi non hai bisogno di un vero file per fare i tuoi test.

import tempfile 

image = tempfile.NamedTemporaryFile(suffix=".jpg").name 

Se si preferisce fare manuale di clean-up, utilizzare tempfile.mkstemp() invece.

Problemi correlati