Почему мой макет URL с запросами не работает? - PullRequest
0 голосов
/ 18 февраля 2020

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

1 Ответ

0 голосов
/ 18 февраля 2020

Вы издеваетесь не над той функцией. 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
...