Невозможно смоделировать файл копирования при импорте из Shutil

Это требует смущающей суммы, чтобы выяснить, но я пытаюсь издеваться над копируемым файлом при использовании в модуле, предназначенном для тестирования. Метод используется как таковой в модуле:

from shutil import copyfile

class ModuleName:
   @staticmethod
   def method_being_tested():
      ...
      copyfile(source, destination)

Однако все вызовы mock игнорируются. Я попытался украсить модульный тест с помощью:

@patch.object(shutil, 'copyfile')
@patch('shutil.copyfile')
@patch('ModuleName.copyfile')

Но копифайл продолжает работать. Кто-нибудь может дать мне какие-нибудь подсказки?


person evilseto    schedule 03.08.2020    source источник


Ответы (1)


Вам нужно исправить его куда он импортируется. Допустим, файл, в котором живет ModuleName, называется my_class.py. Чтобы правильно издеваться над ним, вам нужно сделать @patch(path.to.my_class.py). Ниже приведен краткий пример, иллюстрирующий это.

# demo/my_class.py

from shutil import copyfile

class ModuleName:
    @staticmethod
    def method_being_tested(source, destination):
        copyfile(source, destination)

# test_my_class.py

from unittest.mock import patch
from demo.my_class import ModuleName


@patch("demo.my_class.copyfile")
def test_my_module(mock_copy):
    ModuleName.method_being_tested(1, 2)
    mock_copy.assert_called_once()

Выполнение вышеуказанного выполняется успешно и показывает, что мы успешно издевались над copyfile. Возможно, вам будет полезно прочитать о том, где устанавливать исправления, как показано в документации здесь.

person gold_cy    schedule 03.08.2020