【问题标题】:mock botocore.vendored requests with requests_mock and pytest使用 requests_mock 和 pytest 模拟 botocore.vendored 请求
【发布时间】:2018-11-14 19:11:47
【问题描述】:

我正在尝试使用 requests_mock 模拟获取请求,但它似乎并不正确。

我的函数调用文件lookup.py中定义的第三方API:

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、requests 2.18、requests-mock 1.52 和 pytest 3.0.7。

【问题讨论】:

  • this 为我工作
  • 对不起,我刚刚在创建这篇文章时意识到我使用了错误的导入。我正在尝试使用来自 botocore 的请求,它是 AWS 包和 boto3 的核心

标签: python python-requests boto3


【解决方案1】:

lookup.py 文件中,lookup_urlraise NameError 导致名称 lookup_url 未定义。

使用url,别忘了改params=url_params,所以代码会是这样的:

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

【讨论】:

  • 感谢您的更正。我没有正确编辑代码。
【解决方案2】:

显然你不能用requests_mock模拟from botocore.vendored import requests

改为使用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

【讨论】:

    猜你喜欢
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 2020-04-25
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多