Fab*_*o A 38 python testing django mocking
我需要测试我的Django应用程序的Photo模型.如何使用测试图像文件模拟ImageField?
tests.py
class PhotoTestCase(TestCase):
    def test_add_photo(self):
        newPhoto = Photo()
        newPhoto.image = # ??????
        newPhoto.save()
        self.assertEqual(Photo.objects.count(), 1)
Fab*_*o A 66
对于未来的用户,我已经解决了这个问题.您可以使用SimpleUploadedFile实例模拟ImageField.
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')
Chi*_*and 18
告诉模拟库基于Django的File类创建一个模拟对象
import mock
from django.core.files import File
file_mock = mock.MagicMock(spec=File, name='FileMock')
然后在你的测试中使用
newPhoto.image = file_mock
小智 13
您可以使用临时文件tempfile.因此,您不需要真正的文件来进行测试.
import tempfile
image = tempfile.NamedTemporaryFile(suffix=".jpg").name
如果您更喜欢手动清理,请tempfile.mkstemp()改用.
解:
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())
如果您不想在文件系统中创建实际文件,则可以改用此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')
| 归档时间: | 
 | 
| 查看次数: | 12466 次 | 
| 最近记录: |