Как смоделировать функцию для возврата ответа с атрибутами? - PullRequest
2 голосов
/ 10 июля 2019

Я возиться с unittest.mock и у меня есть некоторые проблемы с ним.

У меня есть объект client с методом get_messages(), который возвращает response с атрибутами data и has_more. Я хочу сделать это, чтобы вернуть фиксированные data и has_more при первом вызове и еще один фиксированный data и has_more при втором вызове.

При первом вызове я хочу получить объект response с атрибутами: data=['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()

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Хорошо, я нашел ответ ... Вообще мой код был в порядке, но я сделал опечатку: side_effects вместо side_effect - ВНИМАНИЕ s .Это должно быть side_effect.Макет принимает все, поэтому не возникло ошибки.В следующий раз определенно буду использовать спецификации: Я все еще не знаю, правильно ли это сделать, но это работает.

это рабочий код:

@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()
0 голосов
/ 11 июля 2019

В соответствии с документами

Если вы передаете итератор, он используется для извлечения итератора, который должен давать значение при каждом вызове. Это значение может быть либо экземпляром исключения, которое должно быть вызвано, либо значением, которое будет возвращено из вызова в mock (обработка 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
...