如何将mock.patch(...)。start()的返回值附加到父模拟?

时间:2016-10-26 01:03:19

标签: python unit-testing python-unittest python-mock python-unittest.mock

模拟示例list this example

>>> manager = MagicMock()
>>> with patch('mymodule.Class1') as MockClass1:
...     with patch('mymodule.Class2') as MockClass2:
...         manager.attach_mock(MockClass1, 'MockClass1')
...         manager.attach_mock(MockClass2, 'MockClass2')
...         MockClass1().foo()
...         MockClass2().bar()
...
<MagicMock name='mock.MockClass1().foo()' id='...'>
<MagicMock name='mock.MockClass2().bar()' id='...'>
>>> manager.mock_calls
[call.MockClass1(),
 call.MockClass1().foo(),
 call.MockClass2(),
 call.MockClass2().bar()]

我想完成相同的事情,但是在修补程序上使用explicit start and stop calls而不是上下文管理器,似乎patcher.start()返回的内容并不是真正的模拟感觉上下文化的,至少是关于将它们附加到父模拟的能力:

>>> from mock import patch, Mock
>>> p = patch('requests.get', autospec=True)
>>> manager = Mock()
>>> manager.attach_mock(p.start(), 'requests_get')
>>> import requests
>>> requests.get('https://google.com')
<MagicMock name='get()' id='4472381392'>
>>> manager.mock_calls
[]
>>> p.stop()
>>> manager.mock_calls
[]

我错过了什么,或者这是一个错误,什么是嘲笑几个这样的电话并验证它们都是按预期顺序制作的最好方法?

1 个答案:

答案 0 :(得分:0)

由于autospec=True并且函数被模拟,patch也会返回一个函数。要访问模拟对象,您可以访问patch(…).start().mock