是否可以模拟 Python 3.6 中的内置 len() 函数?

2024-06-21

是否可以模拟内置len()Python 3.6 中的函数?

我有一个类定义了一个简单的方法,该方法依赖于len()函数如下:

class MyLenFunc(object):
    def is_longer_than_three_characters(self, some_string):
        return len(some_string) > 3

我正在尝试为此方法编写单元测试,但我无法模拟len()函数不会产生错误。 这是我到目前为止所拥有的:

import unittest
from unittest.mock import patch
import my_len_func


class TestMyLenFunc(unittest.TestCase):

    @patch('builtins.len')
    def test_len_function_is_called(self, mock_len):
        # Arrange
        test_string = 'four'

        # Act
        test_object = my_len_func.MyLenFunc()
        test_object.is_longer_than_three_characters(test_string)

        # Assert
        self.assertEqual(1, mock_len.call_count)


if __name__ == '__main__':
    unittest.main()

我发现了另一个问题/答案here https://stackoverflow.com/questions/192649/can-you-monkey-patch-methods-on-core-types-in-python/192857#192857这表明不可能模拟内置函数,因为它们是不可变的。不过,我又发现了几个网站here http://www.voidspace.org.uk/python/mock/examples.html#partial-mocking and here http://www.dsfcode.com/mock-pythons-builtin-functions/这表明情况并非如此。我对上面单元测试类的尝试直接取自这些网站中的后者(是的,我已经尝试了那里提到的其他技术。所有这些都以相同的错误结束)。

我收到的错误相当长,无法发布完整的内容,因此我将剪掉其中的重复部分(您会看到它是从错误消息的最后部分递归的)。错误文本如下:

ERROR: test_len_function_is_called (__main__.TestMyLenFunc)
---------------------------------------------------------------------- 
Traceback (most recent call last):
    File "C:\Python36\Lib\unittest\mock.py", line 1179, in patched
        return func(*args, **keywargs)
    File "C:/Python/scratchpad/my_len_func_tests.py", line 16, in test_len_function_is_called
        test_object.is_longer_than_three_characters(test_string)
    File "C:\Python\scratchpad\my_len_func.py", line 3, in is_longer_than_three_characters
        return len(some_string) > 3
    File "C:\Python36\Lib\unittest\mock.py", line 939, in __call__
        return _mock_self._mock_call(*args, **kwargs)
    File "C:\Python36\Lib\unittest\mock.py", line 949, in _mock_call
        _call = _Call((args, kwargs), two=True)
    File "C:\Python36\Lib\unittest\mock.py", line 1972, in __new__
        _len = len(value)
    ...
    (Repeat errors from lines 939, 949, and 1972 another 95 times!)
    ...
    File "C:\Python36\Lib\unittest\mock.py", line 939, in __call__
        return _mock_self._mock_call(*args, **kwargs)
    File "C:\Python36\Lib\unittest\mock.py", line 944, in _mock_call
        self.called = True RecursionError: maximum recursion depth exceeded while calling a Python object

----------------------------------------------------------------------
Ran 1 test in 0.004s

FAILED (errors=1)

提前谢谢了。


不打补丁builtins.len;现在编码in the mock library中断,因为它需要该功能才能正常运行!修补被测模块的全局变量:

@patch('my_len_func.len')

This adds全球的len到你的模块,以及len(some_string) in the MyLenFunc().is_longer_than_three_characters()方法会找到该函数而不是内置函数。

但是,我必须说,测试是否len()被称为测试感觉像是错误的事情。您想要检查该方法是否为给定的输入生成正确的结果,基本操作如len()只是实现该目标的小组成部分,通常不会进行那种程度的测试。

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

是否可以模拟 Python 3.6 中的内置 len() 函数? 的相关文章

随机推荐

  • 如何停止/关闭 SignalR 服务

    我刚刚从 VS2010 Express 升级到 VS2013 Express 并打开我的项目 我发现 SignalR 正在运行 但我不需要它 Firebug 充满了 SignalR 消息 我花了很长时间搜索如何停止 关闭它 但我找不到它 在
  • 在opencv中将三个灰度[R,G,B]图像合并为单个彩色图像

    我有 3 个使用 split 函数创建的灰度图像 现在我想重新生成彩色图像 我尝试了以下代码 但它不起作用 我得到的结果图像仍然是灰度的 cv Mat R cv imread home r secret R png 0 cv Mat G c
  • wget 从标准输入读取输入

    来自 wget 手册页 2 4 记录和输入文件选项 http gnu org software wget manual wget html Logging and Input File Options i file input file f
  • 使用 POST 将数据从 Android 发送到 AppEngine Datastore

    抱歉 如果这是一个简单的问题 但我只是不知道我应该做什么 而且我认为我有点超出了我的深度 我想将数据从 Android 应用程序发送到在 Google App Engine 上运行的应用程序 数据必须从那里写入数据存储区 我的数据主要采用对
  • 在TYPO3中设置多语言站点

    我正在尝试使用typo3建立一个多语言网站 但遇到了一些麻烦 该网站的默认语言是德语 但我也希望有英语和法语 所以我又定义了2种语言 ID 2的英语和ID 3的法语 接下来我将此打字稿添加到我的模板中 config linkVars L c
  • Matplotlib 轮廓图有 3 种颜色

    我想用 3 种不同的颜色绘制等高线图 到目前为止 我的代码如下所示 import numpy as np import matplotlib pyplot as plt xMin 0 xMax 3 xList np linspace xMi
  • 您可以使用 JavaScript 触发自定义 HTML5 表单错误吗?

    如果我有一个像这样的输入
  • 如何使用 MonoTouch c# 以编程方式获取联系人?

    如何获取 iPhone 中的联系人 我需要从 iPhone 联系人中获取所有属性 如何使用MonoTouch以编程方式实现 ABAddressBook iPhoneAddressBook new ABAddressBook ABPerson
  • 如何在每次调用函数时有选择地简化参数,而不评估函数本身?

    我正在使用 Coq 8 5pl1 举一个人为但具有说明性的例子 fix so simpl will automatically unfold Definition double fix f n 2 n Theorem contrived n
  • 带有 for 循环和管道的批处理脚本

    我想要一个目录中的所有 csv 文件 其文件名不包含单词 summary 在命令提示符下我可以键入以下命令 dir b my dir csv find V summary 当我尝试将上述命令传输到批处理文件中时 我遇到了一个问题 因为 fo
  • Azure 可以运行 WPF 吗?

    我想编写一个在 Windows Azure 上运行的 ASP Net MVC 应用程序 该应用程序将使用 WPF 创建图像 在我开始写之前 这会起作用吗 Azure 是否具有渲染 WPF 所需的 DLL 包括 DirectX 和图形功能 我
  • HTTP 状态码 302

    我正在用 Ruby 开发 Rails 后端 并且想将数据发布到该服务器 但如果我用 PAW 发出后请求 我就会被重定向 我是 Http 请求的新手 有人可以向我解释一下功能以及如何使用 http post 请求吗 我想在我的服务器数据库 s
  • 调整图像大小以适合画布 - Gimp

    我目前正在使用 Gimp 调整一些图像的大小 我是一名 Web 开发人员 但我不太使用图像处理软件 因为大多数图像都是由设计师提供的 所以 Gimp 工具对我来说非常陌生 我已经浏览了 Gimp 网站上的所有教程和帮助指南 但我找不到最简单
  • WHERE 值不在(子查询)

    我一直在努力解决这个问题 我有两张桌子 一张带有优惠券和发票号码的 一张带有发票号码和客户姓名的 我需要找到尚未使用优惠券的顾客 以下是表格 促销表 Promotions Invoice Coupon 1 couponA 2 couponB
  • 使用时间戳查询 Firebase 数据

    这是我当前在 Firebase 上的数据设计 数据只是 事件 参考中的 json 列表 时间戳 操作和持续时间字段是固定的 以后可能会添加更多可选字段 backend 7f34e events KQ30Lc6lasdfasdfAi1URf
  • API 端点的 Django 子域配置

    我已经建立了一个 Django 项目 它使用django rest framework提供一些 ReST 功能 网站和其他功能都运行良好 然而有一个小问题 我需要我的 API 端点指向一个不同的子域 例如 当用户访问该网站时 他 她可以根据
  • id不存在时查找标签文本

    我正在使用 selenium Web 驱动程序在以下 html 标签中查找标签文本 tr style display inline padding left 10px padding right 10px td table width 77
  • 使用 JPA/ORM 生成数据库模式是一个坏主意吗?

    Salve Part of 另一个问题 答案 https stackoverflow com questions 7595578关于 SO 以及其他声称相同的声明 如果您通过 JPA 更新数据库架构 但通常不是一个好的做法 您是否真的不应该
  • Listbox手动DrawItem大字体

    我正在尝试绘制末端是一个的项目 红色字符 并将其删除 字符 并用黑色绘制其他项目 这是我的代码 private void listBox1 DrawItem object sender DrawItemEventArgs e e DrawB
  • 是否可以模拟 Python 3.6 中的内置 len() 函数?

    是否可以模拟内置len Python 3 6 中的函数 我有一个类定义了一个简单的方法 该方法依赖于len 函数如下 class MyLenFunc object def is longer than three characters se