Python mock, django и запросы
Итак, я только начал использовать mock с проектом Django. Я пытаюсь высмеять часть представления, которая делает запрос к удаленному API, чтобы подтвердить, что запрос подписки был подлинным (форма проверки в соответствии со спецификацией, над которой я работаю).
то, что у меня напоминает:
class SubscriptionView(View):
def post(self, request, **kwargs):
remote_url = request.POST.get('remote_url')
if remote_url:
response = requests.get(remote_url, params={'verify': 'hello'})
if response.status_code != 200:
return HttpResponse('Verification of request failed')
то, что я теперь хочу сделать, это использовать mock, чтобы издеваться над requests.get
вызов для изменения ответа, но я не могу понять, как это сделать для декоратора патча. Я думал, ты сделаешь что-нибудь. например:
@patch(requests.get)
def test_response_verify(self):
# make a call to the view using self.app.post (WebTest),
# requests.get makes a suitable fake response from the mock object
как мне этого достичь?
2 ответов
ты почти на месте. Ты просто называешь это немного неправильно.
from mock import call, patch
@patch('my_app.views.requests')
def test_response_verify(self, mock_requests):
# We setup the mock, this may look like magic but it works, return_value is
# a special attribute on a mock, it is what is returned when it is called
# So this is saying we want the return value of requests.get to have an
# status code attribute of 200
mock_requests.get.return_value.status_code = 200
# Here we make the call to the view
response = SubscriptionView().post(request, {'remote_url': 'some_url'})
self.assertEqual(
mock_requests.get.call_args_list,
[call('some_url', params={'verify': 'hello'})]
)
вы также можете проверить, что ответ правильный и имеет право на содержание.
Это все документация:
патч(цели, новые=по умолчанию, спецификаций=нет, создать=false, то spec_set=нет, сайту autospec=нет, new_callable=нет, **kwargs)
target должен быть строкой в форме ' package.модуль.имя класса.’
from mock import patch
# or @patch('requests.get')
@patch.object(requests, 'get')
def test_response_verify(self):
# make a call to the view using self.app.post (WebTest),
# requests.get makes a suitable fake response from the mock object