Подтвердить что ты не робот

Модель тестирования Django с ImageField

Мне нужно проверить модель фото моего приложения Django. Как я могу фальсифицировать ImageField с помощью файла тестового изображения?

tests.py

class PhotoTestCase(TestCase):

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

Ответ 1

Для будущих пользователей я решил проблему. Вы можете высмеять ImageField с экземпляром 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')

Ответ 2

Скажите библиотеке макета для создания макетного объекта на основе класса Django File

import mock
from django.core.files import File

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

а затем используйте в своих тестах

newPhoto.image = file_mock

Ответ 3

Вы можете использовать временный файл, используя tempfile. Таким образом, вам не нужен настоящий файл для выполнения ваших тестов.

import tempfile

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

Если вы предпочитаете выполнять ручную очистку, используйте вместо этого tempfile.mkstemp().

Ответ 4

Решение:

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

И создайте статический метод в вашем классе 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)

Пример:

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

Ответ 5

Если вы не хотите создавать настоящий файл в файловой системе, вместо этого вы можете использовать этот 37-байтовый GIF, достаточно маленький, чтобы быть литералом байтов в вашем коде:

from django.core.files.uploadedfile import SimpleUploadedFile

small_gif = (
    b'\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x00\x00\x00\x21\xf9\x04'
    b'\x01\x0a\x00\x01\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02'
    b'\x02\x4c\x01\x00\x3b'
)
uploaded = SimpleUploadedFile('small.gif', small_gif, content_type='image/gif')

Ответ 6

Другая альтернатива:

from django.core.files import File

newPhoto.image = File(open(image_path))

Ответ 7

Мой подход к тестированию модели без намерения передавать какие-либо полезные данные:

from django.core.files import File
SomeModel.objects.create(image=File(file=b""))

Ответ 8

Для того, чтобы кто-то попробовал загрузить изображение-тест с python 3.xx

Я немного исправлю с Максимом Панфиловым отличный ответ, чтобы сделать более дурацкий образ с независимым именем.

from io import BytesIO
from PIL import Image
from django.core.files.base import File

#in your TestCase class:
class TestClass(TestCase):
    @staticmethod
    def get_image_file(name, ext='png', size=(50, 50), color=(256, 0, 0)):
        file_obj = BytesIO()
        image = Image.new("RGBA", size=size, color=color)
        image.save(file_obj, ext)
        file_obj.seek(0)
        return File(file_obj, name=name)

    def test_upload_image(self):
        c= APIClient()
        image1 = self.get_image('image.png')
        image2 = self.get_image('image2.png')
        data = 
            { 
                "image1": iamge1,
                "image2": image2,
            }
        response = c.post('/api_address/', data ) 
        self.assertEqual(response.status_code, 201)