python: как смоделировать вспомогательный метод? - PullRequest
0 голосов
/ 18 сентября 2018

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

Я отладил его, и не похоже, что я исправил его правильно. Файл помощника по авторизации находится в той же папке «функции», что и тестируемый класс.

EDIT : В 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()

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

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018
  • В вашем первом сценарии

в 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')
0 голосов
/ 18 сентября 2018

patch () работает (временно) изменяя объект, на который указывает имя, с другим. Может быть много имен, указывающих на любой отдельный объект, поэтому для исправления необходимо убедиться, что вы исправили имя, используемое тестируемой системой.

Основной принцип заключается в том, что вы исправляете, где объект ищется, что не обязательно совпадает с местом, где он определен.

В документации по Python есть очень хороший пример. где патчить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...