got*_*nes 8 python unit-testing mocking
是否可以识别子MagicMock模拟对象实例的父模拟对象实例,或父模拟对象实例的子级?例如,如果我有以下代码
>>> from unittest.mock import MagicMock
>>> parent_mock = MagicMock()
>>> child_mock1 = parent_mock(a=1)
>>> child_mock2 = parent_mock(b='spam')
Run Code Online (Sandbox Code Playgroud)
我稍后如何确认子模拟是通过调用产生的parent_mock?我如何检查parent_mock生成了哪些模拟对象?
另外,我如何区分child_mock1具体源自呼叫parent_mock(a=1)和child_mock2源自呼叫parent_mock(b='spam')?
我知道可以手动将模拟附加为其他模拟的属性,但是,它需要大量设置,因为您需要确保显式定义父模拟的返回调用,以便它返回指定的子模拟,并且所以它在几次调用之后就无法很好地扩展。
我稍后如何确认子模拟是通过调用产生的
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
Run Code Online (Sandbox Code Playgroud)
...但看起来你所有其他问题的答案似乎都是“你不能”。
我想你可以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
Run Code Online (Sandbox Code Playgroud)
...那么你可以这样做...
>>> parent_mock = MyMock()
>>> child_mock1 = parent_mock(a=1)
>>> child_mock2 = parent_mock(b='spam')
>>> parent_mock._kids
[((), {'a': 1}, <MyMock name='mock()' id='140358357513616'>),
((), {'b': 'spam'}, <MyMock name='mock()' id='140358357513616'>)]
>>> parent_mock._kids[0][2] is child_mock1
True
>>> parent_mock._kids[1][2] is child_mock2
True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2222 次 |
| 最近记录: |