Не могли бы вы помочь мне понять, что я сделал не так? У меня есть следующий модульный тест для лямбда-выражений Python
class Tests(unittest.TestCase):
def setUp(self):
//some setup
@mock.patch('functions.tested_class.requests.get')
@mock.patch('functions.helper_class.get_auth_token')
def test_tested_class(self, mock_auth, mock_get):
mock_get.side_effect = [self.mock_response]
mock_auth.return_value = "some id token"
response = get_xml(self.event, None)
self.assertEqual(response['statusCode'], 200)
Проблема в том, что когда я запускаю этот код, я получаю следующую ошибку для get_auth_token:
Invalid URL '': No schema supplied. Perhaps you meant http://?
Я отлаживал его, и не похоже, что я исправил его правильно. Вспомогательный файл авторизации находится в той же папке "functions", что и тестируемый класс.
РЕДАКТИРОВАТЬ: В test_class я импортировал get_auth_token следующим образом:
from functions import helper_class
from functions.helper_class import get_auth_token
...
def get_xml(event, context):
...
response_token = get_auth_token()
После перехода на это все стало нормально работать
import functions.helper_class
...
def get_xml(event, context):
...
response_token = functions.helper_class.get_auth_token()
Я до сих пор не совсем понимаю, почему






patch () работает путем (временного) изменения объекта, на который указывает имя, на другой. Может быть много имен, указывающих на любой отдельный объект, поэтому, чтобы исправление работало, вы должны убедиться, что вы исправляете имя, используемое тестируемой системой.
Основной принцип заключается в том, что вы исправляете то место, где ищется объект, а это не обязательно то же место, где он определен.
В документации Python есть очень хороший пример. где патчить
в tested_class.py импортирован get_auth_token
from functions.helper_class import get_auth_token
Патч должен быть именно get_auth_token на tested_class
@mock.patch('functions.tested_class.get_auth_token')
При следующем использовании
response_token = functions.helper_class.get_auth_token()
Единственный способ исправить это
@mock.patch('functions.helper_class.get_auth_token')
При таком импорте в tested_class
from functions import helper_class
helper_class.get_auth_token()
патч может быть таким:
@mock.patch('functions.tested_class.helper_class.get_auth_token')
Теперь, когда я прочитал ваш ответ, он стал более понятным. Спасибо за объяснение!