Как издеваться над функцией, импортированной с псевдонимом? - PullRequest
0 голосов
/ 28 мая 2020

Ниже я добавил фиктивный код, который точно представляет то, что я пытаюсь сделать.

Я импортирую функцию из класса с псевдонимом, я делаю это, поскольку в классе выполняется версия с псевдонимом

То, что я пробовал:

  • http://bhfsteve.blogspot.com/2012/06/patching-tip-using-mocks-in-python-unit.html Это не дает конкретного c решения проблемы.
  • пропатчен a.dummy.class.function.alias как a.dummy.class.function это разрешает выполнение, но не запускает alias_function_mocker (), поскольку в классе функция называется alias (), а не function ()
  • Я пробовал работать как a.dummy.class.function.alias но это приводит к ошибке атрибута, поскольку псевдоним на самом деле не является атрибутом класса (потому что функция ())
from a.dummy.class import function as alias

def alias_function_mocker():
    return 0

@patch("a.dummy.class.function.alias", side_effect=alias_function_mocker):
def test_function(mocked_function):
    function_calling_alias()
    return 0

Я думаю, что корень проблемы заключается в том, что файл класса вызывает функция с использованием псевдонима, и, похоже, нет способа исправить вызовы функций с псевдонимом. Самое простое и наивное решение, которое я могу придумать, - просто не использовать псевдоним.

1 Ответ

0 голосов
/ 28 мая 2020

Вам нужно издеваться над объектом, где он находится. Если вы импортировали модуль / функцию в file.py , вам нужно имитировать объект этого файла.

Если вы используете тест в том же файле метода, это может быть решением:

from os.path import isdir as is_it_a_dir
from unittest.mock import patch

def check(path):
    return is_it_a_dir(path)

with patch('__main__.is_it_a_dir') as mock_isitadir:
    mock_isitadir.return_value = True
    assert check('/any/invalid/path') == True

Если ваш тест находится в другом файле, ваш подход должен работать.

...