Невозможно имитировать копию файла при импорте из shutil - PullRequest
0 голосов
/ 03 августа 2020

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

from shutil import copyfile

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

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

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

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

1 Ответ

1 голос
/ 03 августа 2020

Вам нужно пропатчить его , где он импортируется. Допустим, файл, в котором находится 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. Возможно, вам будет полезно прочитать о , где для исправления, как показано в документации здесь .

...