Pytest макет множественного запроса в одной функции - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь написать контрольный пример для одной из моих функций. Функция выглядит следующим образом:

def function(self):
    token = self.request_post_get_token()
    self.request_post_1(token)
    self.request_post_2(token)
    return 200

каждый тест request_post является вызовом после запроса, и он будет возвращать 200 или 401. как смоделировать каждый вызов после запроса и вернуть 200 и иметь возможность позволить мне проверить вся функция?

Я использую pytest и patch.object. Вот что я написал, но я чувствую, что сделал все неправильно.

def test_function():
    Response = nameTuple('Response', 'status_code text')
    r = Response(200, "test")
    with patch.object(request, 'post', return_value = r):
        self.request_post_get_token()
        with patch.object(requests, 'post', return_value = r):
            self.request_post_1("token")
                with patch.object(requests, 'post', return_value = r):
                self.request_post_2("token")

Ответы [ 3 ]

0 голосов
/ 14 апреля 2020

Вы подходите к этому неправильно. Когда вы пишете тест для функции, она должна тестировать только саму функцию, а не все функции, которые она вызывает во время своего запуска. чтобы проверить, были ли они вызваны с токеном с помощью функции assert_called_once

Вот краткий пример для вас

# Arrange
cls_obj = YourClass()
cls_obj.request_post_2 = Mock()
cls_obj.request_post_1 = Mock()

# Act
cls_obj.function()

# Assert
cls_obj.request_post_2.assert_called_with_once(token)
cls_obj.request_post_1.assert_called_with_once(token)
0 голосов
/ 14 апреля 2020

Предполагая, что каждый запрос в некотором роде уникален ie нет повторяющихся запросов с разным возвратом, вы можете зарегистрировать несколько сопоставителей запросов, которые будут возвращать разные результаты для каждого запроса. https://requests-mock.readthedocs.io/en/latest/matching.html

0 голосов
/ 14 апреля 2020

Поскольку вы хотите проверить свою функцию с именем function, вы должны вызывать ее в тесте - похоже, вы пытаетесь сделать это в test_function. Вместо вставки кода из вашей действительной функции в вашу тестовую функцию, просто вызовите вашу функцию внутри теста:

def test_function():
    with patch.object(requests, 'post', return_value = Response(200, "test") as patched:
        self.function()

    # assert patched....

Приведенный выше код переопределит requests.post, чтобы отследить, сколько раз он были переданы аргументы, и так далее. c. Вы можете использовать patched и его атрибуты , чтобы утверждать, что ваш тест сделал то, что должен был сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...