Я попытался смоделировать указанный c 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, а вместо этого принимает только реальные.
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?