2011-12-23 44 views
10

是否可以生成用于测试目的的内存映像?为Django测试生成内存映像

这里是我当前的代码:

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

即时消息不知道Django,但什么client.post期待图像?像对象一样的文件?一个字节字符串? – dskinner 2011-12-23 02:34:12

+0

@dskinner一个类似文件的对象 – 2011-12-23 02:45:49

回答

1

感谢来自爱德华帮助,我能够得到一个工作解决方案。

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

所以,如果client.post期待像对象的文件,你可以创建一个示例图像(如果你想直观地检查测试结果后),或者只是做一个1px的PNG和控制台

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

这在我的情况下甩出来

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' 

读出来那么你可以使用StringIO的作用像对象的文件,因此以上,图像会

from StringIO import StringIO 

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

,你就会有像的图像数据

14

要生成纯红色的200x200的测试图像:

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

要将其转换为一个类文件对象,那么:

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

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

+0

如果安装了PIL,这也是一个不错的选择 – dskinner 2011-12-23 03:13:30

8

杰森的接受的答案是不是在Django 1.5

为我工作假设生成的文件保存到一个模型的ImageField从单元测试中,我需要把它一步创建一个ContentFile来得到它的工作:

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

在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)