2011-12-23 8 views
10

È possibile generare un'immagine in memoria a scopo di test?Genera immagine in memoria per il test Django

Ecco il mio codice corrente:

def test_issue_add_post(self): 
     url = reverse('issues_issue_add') 
     image = 'cover.jpg' 
     data = { 
      'title': 'Flying Cars', 
      'cover': image, 
     } 
     response = self.client.post(url, data) 
     self.assertEqual(response.status_code, 302) 
+0

im ignorante di Django, ma cosa è client.post che si aspetta per un'immagine? un file come oggetto? una stringa di byte? – dskinner

+0

@dskinner Un oggetto tipo file –

risposta

1

Grazie all'aiuto di Eduardo , Sono riuscito a ottenere una soluzione funzionante.

from StringIO import StringIO 
import Image 

file = StringIO() 
image = Image.new("RGBA", size=(50,50), color=(256,0,0)) 
image.save(file, 'png') 
file.name = 'test.png' 
file.seek(0) 
3

Quindi, se client.post si aspetta un file come oggetto, è possibile creare un immagine di esempio (se si desidera controllare visivamente risultato dopo i test) o semplicemente fare un 1px png e leggere fuori dalla console

open('1px.png', 'rb').read() 

che nel mio caso ha scaricato fuori

image_data = '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x02\x00\x00\x00\x90wS\xde\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\tpHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\xdb\x0c\x17\x020;\xd1\xda\xcf\xd2\x00\x00\x00\x0cIDAT\x08\xd7c\xf8\xff\xff?\x00\x05\xfe\x02\xfe\xdc\xccY\xe7\x00\x00\x00\x00IEND\xaeB`\x82' 

quindi è possibile utilizzare StringIO che agisce come un file come oggetto, così in alto, l'immagine sarebbe

from StringIO import StringIO 

def test_issue_add_post(self): 
    ... 
    image = StringIO(image_data) 
    ... 

e avrete un file come oggetto con i dati di immagine

14

per generare un'immagine 200x200 prova del rosso solido:

import Image 
size = (200,200) 
color = (255,0,0,0) 
img = Image.new("RGBA",size,color) 

per convertirlo in un oggetto simile a file, quindi:

import StringIO 
f = StringIO.StringIO(img.tostring()) 

http://effbot.org/imagingbook/image.htm

+0

questa è una buona scelta anche se PIL è installato – dskinner

8

risposta accettato di Jason non sta funzionando per me in Django 1.5

Supponendo che il file generato è quello di essere salvato di ImageField dall'interno di una prova di unità di un modello, avevo bisogno di fare un ulteriore passo avanti con la creazione di un ContentFile per farlo funzionare:

from PIL import Image 
from StringIO import StringIO 

from django.core.files.base import ContentFile 

image_file = StringIO() 
image = Image.new('RGBA', size=(50,50), color=(256,0,0)) 
image.save(image_file, 'png') 
image_file.seek(0) 

django_friendly_file = ContentFile(image_file.read(), 'test.png') 
1

In Python 3

from io import BytesIO 
from PIL import Image 

image = Image.new('RGBA', size=(50, 50), color=(155, 0, 0)) 
file = BytesIO(image.tostring()) 
file.name = 'test.png' 
file.seek(0) 
Problemi correlati