2014-10-10 4 views
24

Мне нужно проверить модель фото моего приложения 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) 
+1

[Этот вопрос] (http://stackoverflow.com/questions/26141786/django-1-7-imagefield-form-validation) может иметь некоторое релевантное понимание. –

+0

Спасибо, но я не могу понять, как использовать его для решения моей проблемы :( –

ответ

37

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

совершенный, должен быть принятым ответом. Работает в 1.10, спасибо! – Laurent

+10

Не могли бы вы показать мне что такое 'image_path'? – Norak

+0

@Norak. В ходе некоторых экспериментов я обнаружил, что' name' - это имя файла, которое вы хотите использовать для изображения, которое вы читаете, и 'imag e_path' - это путь вашего изображения. Например, '/ path/to/image.jpg'. –

14

Расскажите фиктивный библиотеку, чтобы создать фиктивный объект, основанный на Джанго класса File

import mock 
from django.core.files import File 

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

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

newPhoto.image = file_mock 
+0

Спасибо, но я не люблю использовать сторонние модули для этой цели ... –

+0

, тогда вы можете открыть любое произвольное изображение из любого места 'newPhoto .image = open (/path/to/foo.jpg) ' – ChillarAnand

+0

, но всегда, если я использую модуль mock? –

1

Другой вариант:

from django.core.files import File 

newPhoto.image = File(open(image_path)) 
+1

это не работает, если ваше изображение находится вне каталога MEDIA_ROOT, которое должно произойти, если вы тестируете! –

6

Решение:

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()) 
+0

Спасибо за ответ. Просто отметьте, что для python 3: 'from io import StringIO' – vabada

+0

@dabad thx для заметки. Я обновил ответ. –

9

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

import tempfile 

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

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

Смежные вопросы