基于类的视图中的模拟表单不使用 MagicMock

2023-12-28

我一直在努力模拟表单类以在基于类的视图中替换它的实例。但看起来是这样,因为表单位于类属性中,所以会发生这种情况before我用我的模拟替换了表单类。例证:

应用程序/views.py

from app.forms import SomeForm  # For some reason, this _is_ my mock...

class SomeViewClass(View):
    form = SomeForm  # ... while this is the _real_ SomeForm

    def post(self, request):
        form = self.form(request.POST, request.FILES)

        # Hacked around with pdb here
        # (Pdb) self.form = SomeForm <-- Force the mock into the object
        # (Pdb) form = self.form(request.POST, request.FILES)
        # (Pdb) form.is_valid() is now True
        # (Pdb) continue <--- Test finishes, and asserts are OK.

        if form.is_valid():  # This fails, as I'm running the real code
            # code, code, code

应用程序/测试/test_views.py

from mock import MagicMock, patch

from django.tests import Client, TestCase


@patch('app.views.SomeForm')
    def test_post_valid_form_should_pass(self, mocked_form_class):
        """ Replacing SomeForm in SomeViewClass to pas the is_valid test
        """
        form_instance = MagicMock(spec=SomeForm())
        form_instance.is_valid.return_value = True
        mocked_form_class.return_value = form_instance

        self.client.login(**self.credentials)
        # code, code, code

正如您在插入的评论中看到的app/views.py,我强行重装了self.form并重新定义变量form使用 pdb,这使我的测试通过了。

似乎由于某种原因,SomeViewClass在我开始修补之前已[注册,实例化,...]SomeForm。对此有什么想法吗?


问题是视图已经被 Django 加载并且form字段已经定义并指向SomeForm 生产 class.

正如 @DanielRoseman 和 @foxyblue 在他们的评论中指出的那样,可以直接修补类中的字段。而实际上SO 上已经有答案了 https://stackoverflow.com/a/42180559/2441358。正如所指出的,可以使用patch.object 修补类的成员 https://docs.python.org/3/library/unittest.mock.html#patch-object(在我看来,这是最好的解决方案,因为它更明确,并且不太容易出现拼写错误)

测试更正:

With patch

@patch('app.views.SomeView.form', autospec=SomeForm)
    def test_post_valid_form_should_pass(self, mocked_form_class):
        """ Replacing SomeForm in SomeViewClass.form to pass the is_valid test """
        mocked_form_class.is_valid.return_value = True

        self.client.login(**self.credentials)
        # code, code, code

With patch.object

@patch.object(SomeView, 'form', autospec=SomeForm)
    def test_post_valid_form_should_pass(self, mocked_form_class):
        """ Replacing SomeForm in SomeViewClass.form to pass the is_valid test """
        mocked_form_class.is_valid.return_value = True

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

基于类的视图中的模拟表单不使用 MagicMock 的相关文章

随机推荐

  • 无法确定元数据,因为语句“插入”

    我有一个 select 语句 其中创建了 2 个临时表 并在从这些临时表中获取数据之前插入 select 在它们之间创建联接 最终的选择就是我想要的元数据 在 ssms 中它运行良好 在 ssis 中我不知道为什么它会抛出该错误 查询是这样
  • jquery datatables actionlink如何添加

    我过去几个小时一直在搜索 不幸的是我似乎找不到如何使用 net 和 MVC 使用操作编辑和删除链接列填充数据表的示例 这是我到目前为止所拥有的 如何添加操作链接 我缺少什么 div div table table div div
  • Trie 与 B+ 树

    Trie 树和 B 树在索引按字典顺序排序的字符串时如何比较 大约数十亿 它也应该支持范围查询 从性能 以及实现复杂性的观点 我想说这取决于你的意思Range 如果你的范围表示为所有单词开头为 那么一个Trie我想说的是正确的选择 另一方面
  • Python Pandas - 手动分位数计算

    我正在尝试手动计算列值的分位数 但与 Pandas 的结果输出相比 无法使用公式手动找到正确的分位数值 我四处寻找不同的解决方案 但没有找到正确的答案 In 54 df Out 54 data1 data2 key1 key2 0 0 20
  • AIDL 在调试 APK 中工作,但在签名 APK 中不起作用

    我有 2 个 APK 我在其中共享数据AIDL 当我通过调试 apk 或构建 apk 安装它们时 AIDL工作正常 但当我创作的时候签名的APK对于具有不同密钥的两者 AIDL功能不起作用 有人遇到过同样的问题吗 请帮忙 Thanks 出于
  • 如何从点文件内向 gnuplot 中的每个点添加颜色

    Reading this https stackoverflow com questions 12427704 vary point color based on column value for multiple data blocks
  • 使用 Python 在 Selenium WebDriver 中获取 WebElement 的 HTML 源

    我正在使用 Python 绑定来运行 Selenium WebDriver from selenium import webdriver wd webdriver Firefox 我知道我可以像这样抓取一个网络元素 elem wd find
  • 将 .NET Standard 库添加到 4.7.1 lib 会增加大量引用,其中一些已损坏

    由于我需要导入针对 NET Standard 2 的库 因此我已将库升级到 NET 4 7 1 正如我从 MS 视频中了解到的那样 应该避免此问题 https www youtube com watch v u67Eu IgEMs http
  • malloc后如何获取内存块长度?

    我认为我无法像简单的那样检索分配的内存块的长度 lengthJava 中的函数 然而 我现在知道 当malloc 分配块时 它会分配额外的字节来保存包含块大小的整数 该整数位于块的开头 实际返回给调用者的地址指向刚刚超过该长度值的位置 问题
  • 在 java (JSP) 中将十进制 NCR 代码转换为 UTF-8

    我试图将 FARSI 字符串解码为 UTF 8 但后来我检查了浏览器本身将 FARSI 字符串转换为十进制 NCR 代码 我如何将十进制 NCR 代码转换为 UTF 8 String farMsg String finalMsg new S
  • JCarousel 和 Cufon 不合作:动画让 cufon 消失

    我将 cufon 与 jCarousel 一起使用 轮播中有五个项目 并从右向左旋转 换句话说 它们从屏幕向左旋转 你可以在这里看到它 http www foursquare org site test http www foursquar
  • 使用 Parse.com 解析 xml/HTML 字符串

    我需要解析 parse com 的云代码中的 XML HTML 文件 我有一个字符串 其中包含 html 文件的源代码 我已经尝试过 jsdom 等多个框架 但在 Parse com cloudcode 环境中似乎没有任何效果 例如 此代码
  • React/ZMQ/Ratchet - Websocket 服务器响应

    我目前已经有一个正在运行并使用 Ratchet PHP 的 Web 套接字服务器 我还没有处于希望外部脚本与我的服务器进行通信的阶段 我可以使用 ZMQ 成功地将数据推送到它 push php json name gt Joe Bloggs
  • Pyarrow 从 s3 读取/写入

    是否可以在 s3 中的一个文件夹中读取和写入 parquet 文件到另一个文件夹 而无需使用 pyarrow 将其转换为 pandas 这是我的代码 import pyarrow parquet as pq import pyarrow a
  • 如何使用 Gnuplot 4.6 跟踪图表中的趋势线?

    我有这些数据 2019 08 28 384 2019 08 29 394 2019 08 30 406 2019 08 31 424 2019 09 01 439 2019 09 02 454 2019 09 03 484 和 gnuplo
  • 有没有一种简单的方法来列出带有供应商前缀的 CSS3 关键帧?

    目前我必须列出所有变体 webkit keyframes show from background color rgba 0 0 0 0 to background color rgba 0 0 0 0 8 moz keyframes sh
  • VS2008和ClearCase:打开解决方案无缘无故地请求结帐

    我有一个小问题导致我的自动化构建失败 当我们打开最近从 VS2005 转换为 VS2008 的解决方案时 VS 通过 ClearCase 请求我们签出该解决方案文件 如果我们允许 那么无论如何它都不会进行任何更改 并且默认情况下 Clear
  • Grep 提取与给定模式匹配的单词

    我有一个日志文件 其中包含以下条目 INFO 2013 08 16 13 46 48 660 Index abc 12 insertTotal 11 INFO 2013 08 16 13 46 48 660 Index abcd 12 in
  • 如何在 Maven 中仅部署 zip 工件

    我使用下面的描述符和 pom 文件在 Maven 中完成了一些 zip 打包 但在 Maven 中 默认情况下它会在目标文件夹中创建 jar 和 zip 现在我只想在使用deploy deploy file插件的地方部署zip内容 但它没有
  • 基于类的视图中的模拟表单不使用 MagicMock

    我一直在努力模拟表单类以在基于类的视图中替换它的实例 但看起来是这样 因为表单位于类属性中 所以会发生这种情况before我用我的模拟替换了表单类 例证 应用程序 views py from app forms import SomeFor