Django Test 模拟 ImageField 阻止上传或测试后清理

2024-01-02

我正在为我的项目开发一个测试用例,涉及一些图像和文件字段。有些对象加载了固定装置,有些对象是在测试期间创建的。我用 InMemoryUploadedFile 模拟了我的图像。

创建新的测试对象时,正在上传模拟图像 到 MEDIA_ROOT 目录,位于 upload_to 方法中定义的正确位置。

这些模拟图像实际上在测试期间存储在本地。有相当多的信息是关于如何模拟图像。但我确实找不到一些关于在测试后清理这些上传的好信息。

Question:
是否有可能阻止这些文件实际上传,或者这是不可能/不鼓励的?

or
是否应该上传这些文件以支持测试(如果是,为什么?),并在拆卸过程中进行清理?清理这些上传的文件的适当方法是什么?

我正在处理的当前情况的一些代码,被裁剪为适合问题的大小。我并不是在寻找一个完全成熟的样本,而只是在寻找正确方向的推动。感谢您提前抽出时间。

Cropped模型:

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)

Cropped测试用例:

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

我改变了方法测试具有图像场的模型 https://dirtycoder.net/2016/02/09/testing-a-model-that-have-an-imagefield/。图像将上传到临时目录。该指南建议删除该目录tearDown。它可能会被更新,因为 temp/ 目录会被自动删除。所有测试均顺利通过。

Old answer
I was able to mock the storage with a mock.patch() on default_storage from joeray.me: mocking-files-and-file-storage-for-testing-django-models https://joeray.me/mocking-files-and-file-storage-for-testing-django-models.html

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

不幸的是我无法测试包含以下内容的模型update()save()方法:django-mocking-模型上的存储与更新抛出错误 https://stackoverflow.com/questions/42316729/django-mocking-storage-on-model-with-update-throws-error

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Test 模拟 ImageField 阻止上传或测试后清理 的相关文章

  • Django + WSGI:刷新问题?

    我正在开发一个 Django 网站 我在实时服务器上进行所有更改 只是因为这样更容易 问题是 它似乎时不时地喜欢缓存我正在处理的 py 文件之一 有时 如果我频繁点击刷新 它会在页面的旧版本和新版本之间来回切换 我的设置或多或少类似于 Dj
  • manage.pysyncdb 不会为某些模型添加表

    今天我的第二个不太熟练的问题 我有一个 django 项目 其中安装了四个应用程序 当我运行manage py syndb时 它只为其中两个创建表 据我所知 我的任何模型文件都没有问题 并且所有应用程序都在我的设置文件中的 INSTALLE
  • 自定义 django-rest-framework-simplejwt 的 JWT 响应

    我正在设置 Django 来发送 JWT 响应而不是视图 我尝试使用 django rest framework simplejwt 这个框架中提供了一个函数TokenObtainPairView as view 返回一对 jwt 我需要使
  • 使用 Django ModelForm 上传个人资料图片

    我环顾过相关问题 但似乎没有一个答案有效 我正在尝试上传用户的个人资料图像并让它替换 覆盖 当前图像 保存图像后 我想将文件名更改为用户 ID 图像将以当前形式上传 但不会替换现有图像 例如 它将保存为 2 1 png class Phot
  • djangorest框架:从序列化器validate()方法设置字段级错误

    我有一个序列化程序 它根据其他字段的值验证字段 在错误响应中 我想将每个字段错误显示为字段错误 而不是显示 non field errors 下的所有内容 如果我提出错误 就会发生这种情况对象级验证方法中的 ValidationError
  • 如何将我自己的文件添加到 django 'static' 文件夹

    我读了django静态文件文档 https docs djangoproject com en 1 7 howto static files 并使我的 django 静态文件设置如下 设置 py PROJECT PATH os path r
  • 如何从 django imageFile 输入中获取图像

    我想从ImageField文件输入然后在模板中显示图像 最后将图像保存到模型中imageField The file image request POST get image 只获取图像名称 如何获取实际图像 我需要将图像上传到NamedT
  • 在某些情况下如何告诉mock调用原始方法?

    我有一个类想要在稍后的测试中进行模拟 class Original function calculate a in test mock this gt getMock Original calculate mock gt expcets t
  • Django Rest Framework 分页设置 - 内容范围

    6 30 15 我怎样才能让这个问题变得更好并且对其他人更有帮助 反馈会有帮助 谢谢 我使用 DRF 作为 Dojo Dgrid Web 应用程序的服务器端 Dojo 需要来自服务器的内容范围或范围响应 目前它不发送任何内容 因此 dgri
  • 如何模拟@PrePersist方法?

    如何模拟 PrePersist 方法 例如我实例化的实体的 preInit 我正在使用 TestNG EasyMock 是首选 Test enabled true public void testCreateOrder Instantiat
  • Django 响应总是用 text/html 分块无法设置内容长度

    在我的Django应用程序的views py中 我在尝试设置以下HTTP标头字段后返回一个HttpResponse对象 Create a Response Object with the content to return response
  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • Django在模板中形成多个选择框大小

    我有一个模板
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio
  • 如何将函数设置为 multer 上的限制参数?

    在这个问题之后 我可以使用 multer 和单个 html 表单上传不同文件夹中的多个文件吗 https stackoverflow com questions 39726862 cani upload many files in diff
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • 如何将 .xlsx 文件上传到 jenkins 作业

    如何将 xlsx 文件作为构建参数上传到 jenkins 作业 我尝试使用文件参数 但我发现该文件正在丢失其扩展名或原始格式 有什么方法可以从 jenkins UI 将 excel 文件上传到 jenkins 作业吗 In the file
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di

随机推荐

  • 有效地选择随机数

    我有一个方法 它使用随机样本来近似计算 该方法被调用数百万次 因此选择随机数的过程是否高效非常重要 我不确定java有多快Random nextInt确实如此 但我的程序似乎并没有像我希望的那样受益 选择随机数时 我执行以下操作 以半伪代码
  • 锁定多个 std::mutex 的最佳方法是什么?

    注意 这个问题涉及C 11 C 17 或更高版本 中同一问题的答案可能已更改 详情 std lock guard 还是 std scoped lock https stackoverflow com questions 43019598 s
  • 如何根据 Django 管理中另一个选择标签的选项更改选择标签选项?

    我在 admin py 中有这个 class BrandAdmin admin ModelAdmin list display name category date form BrandAdminForm class Media js ow
  • 实体框架和表值参数

    我正在尝试调用存储过程实体框架它使用表值范围 但是当我尝试执行函数导入时 我不断收到一条警告消息 函数 InsertPerson 有一个参数 InsertPerson TVP 参数索引 0 具有当前的数据类型 表类型 目标 NET Fram
  • 两个数组之间的差异

    我有以下两个数组 我想要这两个数组之间的差异 也就是说 如何找到两个数组中都不存在的值 array1 Array 0 gt 64 1 gt 98 2 gt 112 3 gt 92 4 gt 92 5 gt 92 array2 Array 0
  • 可以在外部html中使用Extjs的脚本吗?

    我已使用以下方法将手动编写的脚本加载到 Extjs Ext Loader LoadScript http docs sencha com extjs 4 1 3 api Ext Loader method loadScript Ext Lo
  • Java PDF 查看器

    我正在使用 java 和 RCP 并且尝试在我的视图中使用 Acrobat 显示 pdf 文档 我不需要改变它们 我的这段代码有这个错误 知道如何解决这个问题吗 P s 同样的时间效果很好 PDFFile pdfFile pdfFile P
  • 如何释放不再使用的 UIImage 内存

    我正在尝试将一些较小的图像合并为一个较大的图像 该应用程序崩溃是因为内存不足 但我不知道如何在使用内存后释放内存 因此它会不断累积 直到应用程序崩溃 addImageToImage 和 resizeImage 例程似乎导致了崩溃 因为在不再
  • 如何为采用单个数组参数的构造函数调用 New-Object?

    在 PowerShell 中 我想使用New Object调用单参数 Net 构造函数new X509Certificate2 byte byteArray 问题是当我使用 powershell 中的字节数组执行此操作时 我得到 新对象 找
  • 确定字符串是否经过两次 Base64 编码

    有什么方法可以确定字符串是否经过两次 Base64 编码 例如 是否有我可以使用的正则表达式模式preg match去做这个 实际答案 不要使用正则表达式 使用解码你的字符串base64 decode http php net manual
  • 模拟已弃用的seaborn distplots

    Seaborn distplot https seaborn pydata org generated seaborn distplot html现已弃用 并将在未来版本中删除 建议使用histplot https seaborn pyda
  • 在 flash builder as3 项目中使用 c++ lib

    是否可以在as3项目中使用c lib 闪存生成器 4 7 我有一个用 C 编写的项目 我想用 flash 构建 gui 我正在寻找一种使用 flash 并使用我的 c 库的方法 我猜想一个Flash http en wikipedia or
  • NetBeans - 在哪里可以找到 IDE 日志?

    我向以下人员报告了一个错误http issues apache org http issues apache org我必须给他们一个 IDE 日志 但我不知道在哪里可以找到它 我搜索了C Users MyUser但没有 netbeans 的
  • 应用程序配置不允许给定 URL Facebook 应用程序错误

    应用程序配置不允许给定 URL 应用程序设置不允许一个或多个给定 URL 它必须与网站 URL 或画布 URL 匹配 或者该域必须是应用程序域之一的子域 我已经研究了关于 SO 的最流行的问题 问题1 https stackoverflow
  • Python - 仅运行一行代码,而不运行脚本中其余的多行代码

    在 Python 中 在 IDLE 内 在文件编辑器窗口中 如何仅运行脚本中选定的单行代码 而不运行程序的其余行 您必须从命令行运行代码行 使用 c 命令 参数 假设您的文件名为 foo py python c import foo pri
  • 根据单词是否粗体更改单词样式的速度很慢

    我想更改活动文档中几个单词的样式 每个单词可能出现多次 有些词是粗体 有些是非粗体 单词存储在数组中Arr 如果找到的单词 X 是非粗体 则将样式替换为StyleA如果它是粗体 则将其更改为StyleB 以下代码有两个问题 1 粗体和非粗体
  • 什么是总线错误?它与分段错误有什么不同吗?

    总线错误 消息是什么意思 它与总线错误有何不同分段故障 https en wikipedia org wiki Segmentation fault 如今 总线错误在 x86 上很少见 当您的处理器甚至无法尝试请求的内存访问时 就会发生总线
  • 无法在 Next 中传递 props

    我正在使用 Next Js React SSR 制作服务器端渲染应用程序 Index js 只需在index中调用另一个组件Layout即可 import Layout from layout import React from react
  • 记录 CMake 模块的正确方法是什么?

    快速的 Google 搜索 实际上许多相当广泛的 Google 搜索 无法解释如何正确记录 CMake 模块 我正在寻找一种记录自定义 CMake 模块的方法 以便它们与cmake help module
  • Django Test 模拟 ImageField 阻止上传或测试后清理

    我正在为我的项目开发一个测试用例 涉及一些图像和文件字段 有些对象加载了固定装置 有些对象是在测试期间创建的 我用 InMemoryUploadedFile 模拟了我的图像 创建新的测试对象时 正在上传模拟图像 到 MEDIA ROOT 目