簡體   English   中英

為什么我用請求模擬 URL 不起作用?

[英]Why does my mocking of an URL with requests not work?

我試圖模擬一個特定的 URL,如下例所示: 如何模擬請求和響應? 測試我自己的功能:

class URLStatus():
  @staticmethod
  def check(url, redirects):
    try:
      session = requests.Session()
      session.max_redirects = redirects
      urlcheck = session.get(url)
      return urlcheck.status_code

問題是它從不接受模擬的 url,而是只接受真實的 url。

import requests

from unittest import TestCase, mock
from unittest.mock import patch

from lib.checks.url_status import URLStatus


def mocked_requests_get(*args, **kwargs):
  class MockResponse:
    def __init__(self, json_data, status_code):
      self.json_data = json_data
      self.status_code = status_code

    def json(self):
      return self.json_data

  if args[0] == 'http://someurl.com/test.json':
    return MockResponse({"key1": "value1"}, 200)
  elif args[0] == 'http://someotherurl.com/anothertest.json':
    return MockResponse({"key2": "value2"}, 200)

  return MockResponse(None, 404)

class URLStatusTestCase(TestCase):

  @mock.patch('lib.checks.url_status.requests.get', side_effect=mocked_requests_get)
  def test_check(self, mock_get):

    url_status = URLStatus()
    test_data = url_status.check('http://someurl.com/test.json', 5)
    self.assertEqual(test_data, 200)


if __name__ == '__main__':
  unittest.main()

例如,這個失敗,因為它將“ http://someurl.com/test.json ”視為 404,而不是 200。我不知道為什么會發生這種情況。

我如何使它采用模擬的 URL?

你在嘲笑錯誤的功能。 requests.get是一個方便的函數,它創建自己的、一次性使用的Session ,然后使用其get方法提供結果。 您的check方法正在使用它自己的Session對象; 您至少需要模擬該對象的get方法。

鑒於您沒有在其他地方重用此會話,更改實現以利用requests.get可能是最簡單的:

class URLStatus():
    @staticmethod
    def check(url, redirects):
        return requests.get(url, max_redirects=redirects).status_code

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM