【问题标题】:How do I attach the return value of mock.patch(...).start() to a parent mock?如何将 mock.patch(...).start() 的返回值附加到父模拟?
【发布时间】:2017-03-08 05:14:17
【问题描述】:

模拟示例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
[]

我是否遗漏了什么,或者这是一个错误,以及模拟几个这样的调用并验证它们是否都按预期顺序进行的最佳方法是什么?

【问题讨论】:

  • 示例已过时:链接的文档现在已删除问题中引用的示例。最接近的类比似乎在这里,但不是完全匹配:docs.python.org/3/library/…

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2011-05-04
    • 2020-04-06
    相关资源
    最近更新 更多