Я пытаюсь использовать пакет Pythons для макета requests
модуля Pythons . Каковы основные требования, чтобы заставить меня работать в сценарии ниже?
В моем views.py у меня есть функция, которая каждый раз делает разные запросы request.get () с разным откликом
def myview(request):
res1 = requests.get('aurl')
res2 = request.get('burl')
res3 = request.get('curl')
В моем тестовом классе я хочу сделать что-то подобное, но не могу точно определить вызовы метода
Шаг 1:
# Mock the requests module
# when mockedRequests.get('aurl') is called then return 'a response'
# when mockedRequests.get('burl') is called then return 'b response'
# when mockedRequests.get('curl') is called then return 'c response'
Шаг 2:
Позвони мой взгляд
Шаг 3:
проверить ответ содержит «ответ», «ответ b», «ответ c»
Как я могу выполнить Шаг 1 (издеваться над модулем запросов)?
Ответы:
Вот как вы можете это сделать (вы можете запустить этот файл как есть):
Важное примечание: если ваш
MyGreatClass
класс живет в другом пакете, скажемmy.great.package
, вы должны использовать mockmy.great.package.requests.get
вместо «request.get». В этом случае ваш тестовый пример будет выглядеть так:Наслаждайтесь!
источник
from unittest import mock
на,import mock
а остальное работает как есть. Вам нужно установитьmock
пакет отдельно.mock_requests_get
необходимостиyield
вместо того, чтобыreturn
из-за изменения возвращать итераторы в Python 3.Попробуйте использовать библиотеку ответов . Вот пример из их документации :
Это обеспечивает довольно приятное удобство по сравнению с настройкой всех насмешек.
Также есть HTTPretty :
Она не специфична для
requests
библиотеки, в некоторых отношениях она более мощная, хотя я обнаружил, что она не так хорошо подходит для проверки перехваченных запросов, чтоresponses
довольно легкоЕсть также httmock .
источник
responses
сопоставить URL-адрес с подстановочными символами, то есть реализовать логику обратного вызова, например, «взять последнюю часть URL-адреса, найти ее на карте и вернуть соответствующее значение». Это возможно, и я просто скучаю по нему?request
аргументу полученВот что сработало для меня:
источник
from unittest import mock
. docs.python.org/3/library/unittest.mock.htmlЯ использовал запросы-макет для написания тестов для отдельного модуля:
И тесты:
источник
это то, как вы издеваетесь над examples.post, измените его на ваш http метод
источник
mockresponse.json = lambda: {'key': 'value'}
mockresponse.json.return_value = {"key": "value"}
Если вы хотите смоделировать ложный ответ, другой способ сделать это - просто создать экземпляр базового класса HttpResponse, например, так:
источник
HttpResponse
, а не ... База, сделал трюк для меня, хотя. Спасибо!Один из возможных способов обойти запросы - использовать библиотеку betamax, она записывает все запросы, и после этого, если вы делаете запрос в том же URL с теми же параметрами, то betamax будет использовать записанный запрос, я использовал его для тестирования веб-сканера и это сэкономит мне много времени.
https://betamax.readthedocs.io/en/latest/
источник
Просто полезный совет тем, кто все еще испытывает затруднения, конвертируя из urllib или urllib2 / urllib3 в запросы и пытаясь смутить ответ - я получал слегка запутывающую ошибку при реализации моего макета:
with requests.get(path, auth=HTTPBasicAuth('user', 'pass'), verify=False) as url:
Ну, конечно, если бы я знал что-нибудь о том, как
with
работает (я не знал ), я бы знал, что это рудиментарный, ненужный контекст (из PEP 343 ). Нет необходимости при использовании библиотеки запросов, потому что она делает то же самое для вас под капотом . Просто убериwith
и используй голую,requests.get(...)
а Боб твой дядя .источник
Я добавлю эту информацию, так как мне было трудно понять, как смоделировать асинхронный вызов API.
Вот что я сделал, чтобы высмеять асинхронный вызов.
Вот функция, которую я хотел проверить
Вам все еще нужен класс MockResponse
Вы добавляете класс MockResponseAsync
Вот тест. Здесь важно создать ответ раньше, поскольку функция init не может быть асинхронной, а вызов getResponse является асинхронным, поэтому все проверено.
Если у вас есть лучший способ сделать это, скажите мне, но я думаю, что это довольно чисто.
источник