如何模拟函数以返回带有属性的响应?

时间:2019-07-10 17:22:42

标签: python unit-testing mocking python-unittest

我正在弄弄LAST_NM并遇到了一些问题。

我有一个对象unittest.mock,具有方法client,该对象返回具有属性get_messages()response的{​​{1}}。我想模拟它在第一次调用中返回固定的datahas_more,在第二次调用中返回另一个固定的datahas_more

在第一次通话中,我想接收具有属性的对象datahas_more response

在第二次通话中,我想接收具有属性的对象data=['msg1', 'msg2']

has_more=True

我一直在尝试这样做,但是我有点困惑,不知道这是不是。

response

2 个答案:

答案 0 :(得分:1)

好的,我找到了答案...通常我的代码很好,但是我打错了:side_effects而不是side_effect-注意 s 。它应该是side_effect。 Mock接受所有内容,因此没有出现错误。下次一定会使用规范的:D我仍然不知道这是否是正确的方法,但是它有效。

这是工作代码:

@patch('Client')
def test_client_returns_correct_messages(self, MockClient):
    MockWebClient.get_messages.side_effect = [
    Mock(name='response',
         data={'messages': received_messages,
               'has_more': True}),
    Mock(name='response',
         data={'messages': received_messages,
               'has_more': False})]

messages = client.get_messages()

答案 1 :(得分:0)

根据docs

  

如果传递一个Iterable,它将用于检索一个迭代器,该迭代器必须在每次调用时产生一个值。该值可以是要引发的异常实例,也可以是从对模拟的调用中返回的值(DEFAULT处理与函数情况相同)。

这是一个使用相同方法但有两个不同答案的两次调用示例。

import os
from unittest.mock import patch

@patch('os.path.curdir', side_effect=[True, False])
def test_side_effect(mock_curdir):
    print(os.path.curdir())
    print(os.path.curdir())

>>> test_side_effect()
True
False