获取模拟对象的“名称”(使用内置方法)

时间:2019-07-18 16:06:45

标签: python mocking

作为另一个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__

1 个答案:

答案 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()'