从 shutil 导入时无法模拟复制文件

Cannot mock copyfile when imported from shutil

这需要花费很多时间才能弄清楚,但我正在尝试模拟 copyfile 在用于测试的模块中使用时。 该方法在模块中如此使用:

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

但copyfile还是继续运行。任何人都可以给我任何线索吗?

您需要对其进行修补其中它正在被导入。假设 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。阅读 where to patch as shown in the documentation here.

可能会对您有所帮助