可以len()在Python 3.6中模拟内置函数吗?
我有一个类,定义了一个简单的方法,该方法依赖于以下len()功能:
class MyLenFunc(object):
def is_longer_than_three_characters(self, some_string):
return len(some_string) > 3
Run Code Online (Sandbox Code Playgroud)
我正在尝试为此方法编写一个单元测试,但是我无法在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()
Run Code Online (Sandbox Code Playgroud)
我在这里找到了另一个SO问题/答案,它暗示不可能模拟出内置函数,因为它们是不可变的。但是,我在这里和这里发现了另外两个网站,这表明其他情况。我在上面的单元测试课程中的尝试直接来自这些网站中的后者(是的,我已经尝试了此处提到的其他技术。所有方法都以相同的错误结尾)。
我收到的错误要花很长时间才能发布完整的内容,因此我将剪掉它的重复部分(您将从错误消息的最后一部分中看到它是递归的)。错误文本如下:
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, …Run Code Online (Sandbox Code Playgroud)