2013-12-11 76 views
3

我试图找到一种方法,当使用Django和sorl-thumbnailget_thumbnail()方法时如何测试缩略图生成。Django + solr.thumbnail:get_thumbnail()在测试环境中失败

环境:

Django==1.5.5 
Pillow==2.1.0 
sorl-thumbnail==11.12 
被测

简化代码(在测试环境中运行):

from StringIO import StringIO 
from PIL import Image 

from django.conf import settings 
from django.core.files.uploadedfile import InMemoryUploadedFile 
from django.db import models 
from sorl.thumbnail import get_thumbnail 

# simple class with ImageField 
class User(models.Model): 
    avatar = models.ImageField(upload_to='avatars', default=None, null=True, blank=True) 

    def get_thumbnail_uri(self): 
     avatar_thumbnail = get_thumbnail(self.avatar, '100x100') 

     return avatar_thumbnail.url 

# make sure we're using in-memory test env. 
assert settings.THUMBNAIL_STORAGE == 'inmemorystorage.InMemoryStorage' 
assert settings.DEFAULT_FILE_STORAGE == 'inmemorystorage.InMemoryStorage' 

# prepare image 
fake_file = StringIO() 

picture = Image.new(mode='RGBA', size=(500, 500), color=(255, 0, 0, 0)) 
picture.save(fake_file, 'JPEG') 

fake_file.name = 'test.jpg' 
fake_file.seek(0) 

uploaded_image = InMemoryUploadedFile(fake_file, field_name=None, name='test.jpg', 
             content_type='image/jpeg', size=fake_file.len, 
             charset=None) 

# add image to user 
u = User() 
u.avatar = uploaded_image 

assert u.get_thumbnail_uri() is not None 

上面总是失败,在最后一行:

Traceback (most recent call last): 
    File "/vagrant/path/to/file.py", line 1440, in test_stackprep 
    assert u.get_thumbnail_uri() is not None 
    File "/vagrant/path/to/file.py", line 1413, in get_thumbnail_uri 
    avatar_thumbnail = get_thumbnail(self.avatar, '100x100') 
    File "/home/vagrant/.virtualenv/appname/local/lib/python2.7/site-packages/sorl/thumbnail/shortcuts.py", line 8, in get_thumbnail 
    return default.backend.get_thumbnail(file_, geometry_string, **options) 
    File "/home/vagrant/.virtualenv/appname/local/lib/python2.7/site-packages/sorl/thumbnail/base.py", line 56, in get_thumbnail 
    source_image = default.engine.get_image(source) 
    File "/home/vagrant/.virtualenv/appname/local/lib/python2.7/site-packages/sorl/thumbnail/engines/pil_engine.py", line 13, in get_image 
    return Image.open(buf) 
    File "/home/vagrant/.virtualenv/appname/local/lib/python2.7/site-packages/PIL/Image.py", line 2008, in open 
    raise IOError("cannot identify image file") 
IOError: cannot identify image file 

我认为运行测试时,Django或者sorl-thumbnail会跳出inmemorystorage。我已经在很长一段时间了,但我没有找到任何可行的配置,除了直接在文件系统上测试东西(我想避免这种情况)。

有没有人设法得到sorl的get_thumbnail()方法在测试中工作?

谢谢。

回答

3

版本11.12是PyPI今天的最新版本,已有2年的历史。在回购中有版本12.0,这应该可以工作。它不在PyPI上,因为有change of maintainers,我想他们还没有机会这样做。

我试过主版本,它可以与你的例子一起工作。