【问题标题】:mock call returns an empty list模拟调用返回一个空列表
【发布时间】:2021-09-23 12:18:00
【问题描述】:

我正在为模型编写单元测试。该调用返回一个空列表,我不确定如何调试出了什么问题。 这是我的代码:

    @patch('app.models.client.post')
    def test_something(self, mock):
       
        method_mock.return_value = None
        payloads = [json.loads(call[2]['data']) for call in mock.mock_calls]
        
        # do something else

        self.assertEquals('stuff', payloads[0]['x']['y'])

我注意到mock.mock_calls 返回[],因此断言中的错误list index out of range 我在这里错过了什么?

提前致谢!

【问题讨论】:

  • 您是否调用了一个会影响您的 app.models.client.post 函数的函数?如果不是, mock_calls 将为空。 mock_calls 是每次调用 mock 时的 Call 对象列表,因此如果您设置 mock,则它是空的,然后立即询问它是如何被调用的。
  • client 基本上是 models.py 中的client = requests.Session()。这就是到目前为止的所有用法

标签: python unit-testing python-decorators


【解决方案1】:

在您的代码中,在模拟(您的补丁装饰器)的实例化和您第一次调用mock.mock_call 之间,我看不到任何最终会调用app.models.client.post 的逻辑。

>>> from unittest.mock import Mock
>>> m = Mock()
>>> m.mock_calls  # mock_calls is empty, we've never called the mock ex: m('something')
[]
>>> m('a')  # we call it
<Mock name='mock()' id='4342272064'>
>>> m.mock_calls  # mock_calls is populated with the arguments of the call
[call('a')]

您必须触发在app.models 中调用client.post 的代码。也许通过使用RequestFactory

【讨论】:

  • @twingo 有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多