作为另一个Mock的属性(或作为__repr__
的返回)而获得的Mock对象的__call__
表示,看起来像是name
属性。但是,该伪属性似乎在类中不存在。例如:
>>> import mock
... x = mock.MagicMock()
... y = x.asdf
... z = y.hjkl
... a = z()
>>> a
<MagicMock name='mock.asdf.hjkl()' id='139706648472600'>
>>> 'name' in a.__dict__
False
为了获得此伪属性,似乎我可以解析y.__repr__()
的返回值或某种类似的递归函数:
def get_mock_name(some_mock):
if some_mock._mock_name:
return f'{get_mock_name(some_mock._mock_parent)}.{some_mock._mock_name}'
elif some_mock._mock_new_name:
return f'{get_mock_name(some_mock._mock_new_parent)}{some_mock._mock_new_name}'
else:
return 'mock'
这两种方法都可行,是否有任何 标准和/或内置方式 ?
编辑:否,我不是在问如何覆盖__repr__
答案 0 :(得分:0)
感谢@chepner为我设置了这个答案!
可以使用Mock._extract_mock_name()的the version of mock
that ships with python 3.7方法获得“名称”伪属性。
此方法实际上是used in the implementation of __repr__
to get this information封装了以前只是__repr__
函数一部分的行为。
您可以像这样使用它:
$ python
Python 3.7.3 (default, Jul 19 2019, 10:33:54)
[GCC 7.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import unittest.mock as mock
>>> x = mock.MagicMock()
>>> y = x.asdf
>>> z = y.hjkl
>>> a = z()
>>> a._extract_mock_name()
'mock.asdf.hjkl()'