【问题标题】:How to mock function to return response with attributes?如何模拟函数以返回带有属性的响应?
【发布时间】:2019-07-10 17:22:42
【问题描述】:

我在搞乱unittest.mock 并遇到了一些问题。

我有一个对象client,方法为get_messages(),它返回response,属性为datahas_more。我想模拟它以在第一次调用中返回固定的 datahas_more,在第二次调用中返回另一个固定的 datahas_more

在第一次通话中,我想接收带有属性的对象responsedata=['msg1', 'msg2'] has_more=True

在第二次通话中,我想接收带有属性的对象response

data=['msg3', 'msg4']

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

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

messages = client.get_messages()

【问题讨论】:

标签: python unit-testing mocking python-unittest


【解决方案1】:

好的,我找到了答案... 通常我的代码没问题,但我打错了:side_effects 而不是 side_effect - 注意 s。应该是side_effect。模拟接受一切,所以它没有出现错误。下次肯定会使用规范: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()

【讨论】:

    【解决方案2】:

    根据docs

    如果您传入一个可迭代对象,它会用于检索一个迭代器,该迭代器必须在每次调用时产生一个值。该值可以是要引发的异常实例,也可以是要从模拟调用返回的值(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
    

    【讨论】:

    • 是的,我在 side_effect 中得到了迭代器的想法。对我来说,问题是返回一个属性为 data 的对象,而不为它创建一个类。我通过使用 Mock 类绕过了它,我可以在其中添加我想要的任何属性。不知道这是否是正确的方法。无论如何,我的解决方案有效,但我在 side_effects 中有错字
    猜你喜欢
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2020-07-07
    相关资源
    最近更新 更多