Python: как издеваться над вспомогательным методом?

Не могли бы вы помочь мне понять, что я сделал не так? У меня есть следующий модульный тест для лямбда-выражений 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()

Я до сих пор не совсем понимаю, почему

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
1 432
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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')

Теперь, когда я прочитал ваш ответ, он стал более понятным. Спасибо за объяснение!

Alex Lungu 19.09.2018 10:49

Другие вопросы по теме