Django测试模拟ImageField在测试后阻止上载或清理
我正在为我的项目编写一个测试用例,涉及一些图像和文件字段。有些对象加载了装置,有些对象是在测试期间创建的。我用一个InMemoryPloadedfile嘲弄我的形象 创建新的测试对象时,模拟的图像正在上载 到“上载到”方法中定义的正确位置的媒体根目录 这些模拟图像实际上在测试期间存储在本地。关于如何模拟图像,有很多信息。但是我真的找不到一些关于在测试之后清理这些上传的好信息 问题:Django测试模拟ImageField在测试后阻止上载或清理,django,file-upload,mocking,python-2.x,testcase,Django,File Upload,Mocking,Python 2.x,Testcase,我正在为我的项目编写一个测试用例,涉及一些图像和文件字段。有些对象加载了装置,有些对象是在测试期间创建的。我用一个InMemoryPloadedfile嘲弄我的形象 创建新的测试对象时,模拟的图像正在上载 到“上载到”方法中定义的正确位置的媒体根目录 这些模拟图像实际上在测试期间存储在本地。关于如何模拟图像,有很多信息。但是我真的找不到一些关于在测试之后清理这些上传的好信息 问题: 是否有可能阻止这些文件被实际上传,或者这是不可能的/不鼓励的 或 是否应该上传这些文件以利于测试(如果是,为什么?
是否有可能阻止这些文件被实际上传,或者这是不可能的/不鼓励的 或
是否应该上传这些文件以利于测试(如果是,为什么?),并在拆卸过程中进行清理?什么是清理这些上传文件的合适方法 我正在处理的当前情况的一些代码,裁剪到适合问题的大小。我不是在寻找一个完整的样本,只是在正确的方向推动。提前感谢您抽出时间 裁剪的型号:
def project_image_upload_location(instance, filename):
return 'uploads/projects/images/%s' % \
services.unique_filename(filename)
class ProjectImage(models.Model):
project = models.ForeignKey(
'projects.Project')
name = models.CharField(
_("Image name"),
max_length=35)
image = models.ImageField(
_("Project image"),
upload_to=project_image_upload_location,
width_field='image_width',
height_field='image_height')
image_width = models.IntegerField(
default=0)
image_height = models.IntegerField(
default=0)
裁剪测试用例:
from django.core.files.uploadedfile import InMemoryUploadedFile
from django.test import TestCase
from PIL import Image
import StringIO
from projects.models import ProjectImage
from projects import services
class ProjectsTest(TestCase):
fixtures = ['projects']
def _create_project_image(self, project, name):
return ProjectImage.objects.create(
project=project,
name=name,
description="Description",
image=self._create_mock_image(name="Mocked Image"),
is_primary=True,
is_published=True)
def _get_project_image(self, name):
return ProjectImage.objects.get(name=name)
def _create_mock_image(self, name):
name = name + '.jpg'
io = StringIO.StringIO()
size = (200,200)
color = (255,0,0)
image = Image.new("RGB", size, color)
image.save(io, format='JPEG')
image_file = InMemoryUploadedFile(io, None, name, 'jpeg', io.len, None)
image_file.seek(0)
return image_file
def test_update_project_set_updated_datetime(self):
project = self._get_project("Project B")
self.assertEqual(project.updated_datetime, None)
project.save()
self.assertTrue(isinstance(project.updated_datetime, datetime))
我已经改变了方法。映像将上载到临时目录。本指南建议删除
拆卸
中的目录。它可能会被更新,因为临时/目录会被自动删除。所有测试均顺利通过
旧答案我可以在
default\u存储上使用mock.patch()模拟存储
导入模拟
当前存储='django.core.files.storage.default\u storage.\u wrapped'
def_mock_storage():
返回mock.MagicMock(spec=Storage,name=“StorageMock”)
类项目测试(测试用例):
固定装置=['projects']
@修补程序(当前\u存储,\u mock\u存储())
定义创建项目(自我,名称):
返回Project.objects.create(
name=name,
short_description=“short description A”,
完整描述=“完整描述A”,
url=”http://test-project-url.com/",
是否已发布(为真)
不幸的是,我无法测试在save()
方法中包含update()
的模型:
<..crop..>
import mock
current_storage = 'django.core.files.storage.default_storage._wrapped'
def _mock_storage():
return mock.MagicMock(spec=Storage, name="StorageMock")
class ProjectsTest(TestCase):
fixtures = ['projects']
@mock.patch(current_storage, _mock_storage())
def _create_project(self, name):
return Project.objects.create(
name=name,
short_description="Short description A",
full_description="Full description A",
url="http://test-project-url.com/",
is_published=True)