Создать образ в памяти для тестирования Django - PullRequest
12 голосов
/ 23 декабря 2011

Возможно ли создать образ в памяти для тестирования?

Вот мой текущий код:

  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)

Ответы [ 6 ]

14 голосов
/ 23 декабря 2011

Чтобы создать 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

10 голосов
/ 03 апреля 2014

Принятый ответ Джейсона не работает для меня в 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')
3 голосов
/ 16 декабря 2014

В Python 3

from io import BytesIO
from PIL import Image

image = Image.new('RGBA', size=(50, 50), color=(155, 0, 0))
file = BytesIO(image.tobytes())
file.name = 'test.png'
file.seek(0)
#  + + + django_friendly_file = ContentFile(file.read(), 'test.png') # year 2019, django 2.2.1  -works 
3 голосов
/ 23 декабря 2011

Так что, если client.post ожидает файл, подобный объекту, вы можете создать пример изображения (если вы хотите визуально проверить результат после тестов) или просто сделать pp размером 1 пиксель и прочитать его из консоли

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

и у вас будет файл как объект с данными изображения

2 голосов
/ 23 декабря 2011

Благодаря помощи Эдуардо мне удалось получить рабочее решение.

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)
0 голосов
/ 23 декабря 2011

Вы использовали модуль PIL?Он позволяет вам манипулировать изображениями - и должен позволять создавать.

Фактически, вот запись в блоге с некоторым кодом, который делает это http://bradmontgomery.blogspot.com/2008/07/django-generating-image-with-pil.html

Не знаю, есть ли у тестируемой машины интернетсоединение, но вы также можете вытащить случайные изображения из Google, чтобы изменить данные теста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...