mock botocore.vendored запросы с запросами - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь смоделировать запрос get с помощью requests_mock, но, похоже, он не получается правильно.

Моя функция вызывает сторонний API, определенный в файле lookup.py:

from botocore.vendored import requests

def get_data():
   url = 'https://abc.something.com/datapackage'
   url_params={
      'v': 2,
      'auth_apikey':'xyz'
   }
   resp = requests.get(url, params=url_params)
   return resp.json()

Я использую py.test для запуска моих тестов и в моем тестовом файле. У меня есть приспособление:

  import requests_mock
  import requests, pytest
  from lookup import get_data

  @pytest.fixture
  def req_mock(request):
    m = requests_mock.Mocker()
    m.start()
    request.addfinalizer(m.stop)
    return m

  def test_api_gets_data(req_mock):
      sample={
          'key1':123
      }
      lookup_url = 'https://abc.something.com/datapackage'
      query_params = {
        'v': 2,
        'auth_apikey':'xyz'
      }
      req_mock.get(lookup_url, json=sample)
      resp = get_data()

По-видимому, requests_mock не может использовать тот же сеанс, что и запросы в функции get, поэтому его не осмеивают.

Есть ли лучший способ сделать это?

Я использую Python 3.6, запросы 2.18, запросы-макет 1.52 и pytest 3.0.7.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Видимо, вы не можете издеваться from botocore.vendored import requests с requests_mock.

Вместо этого используйте unittest.mock, чтобы высмеивать ответ.

  from unittest import mock

  class MockResponse:
    def __init__(self, status_code, json_data=None):
      self.json_data = json_data
      self.status_code = status_code

   def json(self):
      return self.json_data

   def raise_for_status(self):
      if self.status_code >= 500:
        raise Exception

 item_not_found = {
    "Response": {
      "StatusCode": "ItemNotFound",
    }
 }

 item_not_found_resp = MockResponse(200, item_not_found)


 @mock.patch('botocore.vendored.requests.get', return_value=item_not_found_resp)
 def test_api_returns_not_found_when_third_party_api_returns_item_not_found(mc):
     resp = get(e1, c)
     exp_resp = {
       "statusCode": 404,
       "body": json.dumps({
        'error': 'no item found'
       })
     }
   request_url = mc.call_args[0][0]
   request_params = mc.call_args[1]['params']
   assert lookup_url == request_url
   assert query_params == request_params
   assert exp_resp == resp
0 голосов
/ 15 ноября 2018

в lookup.py файлах, lookup_url будет raise NameError имя причины lookup_url не определено.

используйте url и не забудьте изменить params=url_params, поэтому код будеткак то так:

resp = requests.get(url, params=url_params)

...