Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django测试模拟ImageField在测试后阻止上载或清理_Django_File Upload_Mocking_Python 2.x_Testcase - Fatal编程技术网

Django测试模拟ImageField在测试后阻止上载或清理

Django测试模拟ImageField在测试后阻止上载或清理,django,file-upload,mocking,python-2.x,testcase,Django,File Upload,Mocking,Python 2.x,Testcase,我正在为我的项目编写一个测试用例,涉及一些图像和文件字段。有些对象加载了装置,有些对象是在测试期间创建的。我用一个InMemoryPloadedfile嘲弄我的形象 创建新的测试对象时,模拟的图像正在上载 到“上载到”方法中定义的正确位置的媒体根目录 这些模拟图像实际上在测试期间存储在本地。关于如何模拟图像,有很多信息。但是我真的找不到一些关于在测试之后清理这些上传的好信息 问题: 是否有可能阻止这些文件被实际上传,或者这是不可能的/不鼓励的 或 是否应该上传这些文件以利于测试(如果是,为什么?

我正在为我的项目编写一个测试用例,涉及一些图像和文件字段。有些对象加载了装置,有些对象是在测试期间创建的。我用一个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)