Ответ 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)
Возможно ли создать изображение в памяти для целей тестирования?
Вот мой текущий код:
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)
Благодаря помощи Эдуардо, я смог получить рабочее решение.
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)
Чтобы создать тестовое изображение 200x200 сплошного красного:
import Image
size = (200,200)
color = (255,0,0,0)
img = Image.new("RGBA",size,color)
Чтобы преобразовать его в файл-подобный объект, выполните следующие действия:
import StringIO
f = StringIO.StringIO(img.tostring())
Джейсон принял ответ, который не работает для меня в Django 1.5
Предполагая, что сгенерированный файл должен быть сохранен в модели ImageField
из unit test, мне нужно было сделать еще один шаг, создав 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')
Итак, если 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)
...
и у вас будет файл, подобный объекту с данными изображения
В 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)
Используете ли вы модуль PIL? Он позволяет вам манипулировать изображениями - и также должен позволять создавать.
Фактически, здесь запись в блоге с некоторым кодом, который делает это http://bradmontgomery.blogspot.com/2008/07/django-generating-image-with-pil.html
Не знаю, есть ли у вас тестовое устройство подключение к Интернету, но вы также можете удалить случайные изображения из Google, чтобы изменить тестовые данные?