【发布时间】:2021-08-09 13:32:18
【问题描述】:
我有一个这样的 Python 类:
class MyClass:
def __init__(self, client=None):
self._client = client or Client()
def encode(self, **kwargs):
encoded = self._client.encode(**kwargs)
[...]
所以这里的模式是MyClass 可以使用在初始化期间指定的Client。如果没有指定,构造函数会初始化一个新的Client 对象。
我想测试这个类,传递一个模拟的Client 实例:
with patch("Client", autospec=True) as mock_client:
my_class = MyClass(client=mock_client)
my_class.encode()
[...]
我注意到,与预期不同的是,MyClass.__init__() 中初始化了一个新的 client 对象。
调试时,原来是因为被模拟的客户端评估为False:
bool(mock_client)
False
我实际上可以像这样重写我的构造函数以使其按预期工作:
self._client = Client() if client is None else client
但这似乎更麻烦。为什么bool(mock_client) 计算结果为False 而mock_client is None 是True,这也令人困惑。
documentation about Boolean expressions in Python 声明如下:
以下值被解释为 false:False、None、所有类型的数字零以及空字符串和容器(包括字符串、元组、列表、字典、集合和冻结集)。所有其他值都被解释为 true
我不明白为什么 MagicMock 对象应该根据这个定义评估为 False。
当我像这样创建模拟对象时,它确实评估为True:
mock_client = patch("Client", autospec=True)
bool(mock_client) # -> True
然而,在这种情况下,模拟的客户端似乎缺乏规范,所以我收到了这个错误:
E AttributeError: '_patch' object has no attribute 'encode'
使用patch 作为上下文管理器的第一种方法更可取,并由the documentation 推荐。它似乎也符合我的预期,只是它的计算结果为False。
有没有办法在不更改我的代码的情况下处理这个问题?我发现if client is None Client() else client 比client or Client() 可读性差很多。
此外,我完全不明白为什么 bool(mock_client) 的计算结果为 False。这是unittest.mock 中的错误还是功能?
【问题讨论】:
-
您想要一个模拟客户端,但您在
MyClass上使用patch。你不想给Client打补丁吗? -
@Kyle 你是对的,这是一个复制粘贴错误。固定。
标签: python unit-testing nonetype