是否可以识别子模拟对象实例的父
MagicMock模拟对象实例,或父模拟对象实例的子实例?例如,如果我有以下代码
>>> from unittest.mock import MagicMock
>>> parent_mock = MagicMock()
>>> child_mock1 = parent_mock(a=1)
>>> child_mock2 = parent_mock(b='spam')
我怎么能在以后确认从调用parent_mock产生的儿童嘲笑?我怎样才能检查parent_mock生成的模拟对象?
另外,我怎么能区分child_mock1专门来自调用parent_mock(a = 1),而child_mock2来自调用parent_mock(b =’spam’)?
我理解一个可以manually attach mocks as attributes of other mocks,但是,它需要大量的设置,你需要确保明确定义父模拟的返回调用,以便它返回指定的子模拟,因此它不能很好地扩展过了几个电话.
最佳答案
How could I confirm later that the child mocks spawned from calling parent_mock?
好吧,有一个未记录的属性_mock_new_parent,您可以像这样使用…
>>> from unittest.mock import MagicMock
>>> parent_mock = MagicMock()
>>> child_mock1 = parent_mock(a=1)
>>> child_mock2 = parent_mock(b='spam')
>>> child_mock1._mock_new_parent is parent_mock
True
>>> child_mock2._mock_new_parent is parent_mock
True
…但看起来你所有其他问题的答案都是“你不能”.
我想你可以将MagicMock子类化,用这样的东西跟踪它的孩子…
class MyMock(MagicMock):
def __init__(self, *args, **kwargs):
MagicMock.__init__(self, *args, **kwargs)
self._kids = []
def __call__(self, *args, **kwargs):
result = MagicMock.__call__(self, *args, **kwargs)
self._kids.append((args, kwargs, result))
return result
……然后你可以……
>>> parent_mock = MyMock()
>>> child_mock1 = parent_mock(a=1)
>>> child_mock2 = parent_mock(b='spam')
>>> parent_mock._kids
[((), {'a': 1}, ),
((), {'b': 'spam'}, )]
>>> parent_mock._kids[0][2] is child_mock1
True
>>> parent_mock._kids[1][2] is child_mock2
True