Как исправлять запросы.get из другого файла в python

#python #unit-testing #mocking #patch

#python #модульное тестирование #издевательство #исправление

Вопрос:

У меня есть 2 файла python: 1 для модульного тестирования (tests.py ) и 1 для скрипта, который я хочу протестировать (main.py ):

 # In main.py:

import requests

def get_response(url):
    response = requests.get(url);
    # Do stuff...
    return response
  

 # In tests.py

from unittest import mock
from unittest.mock import patch
from my_project.main import get_response

def some_handler(url):
    return "test_response"

class GetResponseTestCase(unittest.TestCase):

    def setUp(self):

        # setup mocks
        patch('requests.get', mock.Mock(side_effect=some_handler)

    def run_test(self):

        result = get_response("test_response")
  

Я хочу исправить, requests.get чтобы вернуть test_response , но исправление не работает, потому что оно пытается отправить запрос / установить соединение с указанным URL. Я думаю, что название исправления requests.get не предназначено для места, в котором оно используется main.py (поскольку это относится к тому, где оно определено вместо этого), как некоторые люди упоминали в Интернете. Но в этом сценарии я не уверен, как это исправить.

Если import requests используется в main.py тогда как я могу исправить это из другого файла? Спасибо.

Ответ №1:

  1. Имитируйте get_reponse вместо того, чтобы имитировать requests.get (имитирующие встроенные функции; то, что возможно в python, не требуется для такого простого случая использования).
  2. Установите возвращаемое значение издевательской функции get_response в «test_response».

В tests.py

 from unittest import mock

class GetResponseTestCase(unittest.TestCase):

    @mock.patch("my_project.main.get_response") ##mocking get_response
    def run_test(self, mocked_get_response):
        mocked_get_response.return_value = "test_response" ## setting return value
  

Ответ №2:

Обнаружил, что мне нужно добавить .start() в конце вызова для создания исправления:

 # setup mocks
patch('requests.get', mock.Mock(side_effect=some_handler).start()
  

Если есть какие-либо проблемы с этим решением или лучший способ справиться с этим, я хотел бы это услышать!

Комментарии:

1. Я полагаю, вам нужно закрыть paren для patch( — я предполагаю, что для этого вызывается .start , а не макет.