2014-10-10 22 views
24

Tôi cần kiểm tra mô hình Ảnh của ứng dụng Django của mình. Làm thế nào tôi có thể thử ImageField với một tập tin hình ảnh thử nghiệm?Mô hình thử nghiệm Django với ImageField

tests.py

class PhotoTestCase(TestCase): 

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

[Câu hỏi này] (http://stackoverflow.com/questions/26141786/django-1-7-imagefield-form-validation) có thể có một số thông tin chi tiết có liên quan. –

+0

Cảm ơn, nhưng tôi không thể sử dụng nó để giải quyết vấn đề của mình: ( –

Trả lời

37

Đối với người dùng trong tương lai, tôi đã giải quyết được vấn đề. Bạn có thể giả lập một ImageField bằng một cá thể 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

hoàn hảo, nên là câu trả lời được chấp nhận. Làm việc trong 1,10, cảm ơn! – Laurent

+10

Bạn có thể chỉ cho tôi 'image_path' là gì? – Norak

+0

@Norak Thông qua một số thử nghiệm, tôi thấy rằng' tên' là tên tệp bạn muốn sử dụng cho hình ảnh bạn đã đọc và 'tưởng tượng e_path' là đường dẫn của hình ảnh của bạn. Ví dụ: '/ path/to/image.jpg'. –

14

Cho thư viện mô hình để tạo ra một đối tượng giả dựa trên Django của lớp File

import mock 
from django.core.files import File 

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

và sau đó sử dụng trong các thử nghiệm của bạn

newPhoto.image = file_mock 
+0

Cảm ơn, nhưng tôi không thích sử dụng các mô-đun bên thứ 3 cho mục đích này ... –

+0

thì bạn có thể mở bất kỳ hình ảnh nào từ bất kỳ vị trí nào 'newPhoto .image = open (/path/to/foo.jpg) ' – ChillarAnand

+0

nhưng luôn luôn nếu tôi sử dụng mô-đun giả? –

1

Một thay thế:

from django.core.files import File 

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

tính năng này không hoạt động nếu hình ảnh của bạn nằm ngoài thư mục MEDIA_ROOT, điều này sẽ xảy ra nếu bạn đang thử nghiệm! –

6

Giải pháp:

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

Và tạo ra một phương pháp tĩnh trong lớp TestCase của bạn:

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

Ví dụ:

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

Cảm ơn câu trả lời. Chỉ cần lưu ý rằng đối với python 3: 'từ io nhập StringIO' – vabada

+0

@dabad thx để lưu ý. Tôi đã cập nhật câu trả lời. –

9

Bạn có thể sử dụng một tập tin tạm thời, sử dụng tempfile. Vì vậy, bạn không cần một tập tin thực sự để làm bài kiểm tra của bạn.

import tempfile 

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

Nếu bạn thích làm sạch thủ công, hãy sử dụng tempfile.mkstemp() thay thế.

Các vấn đề liên quan