猿问

从 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 仍在继续运行。谁能给我任何线索?


MMMHUHU
浏览 135回答 1
1回答

互换的青春

您需要在导入的地方修补它。假设ModuleNamelives 所在的文件名为my_class.py. 为了正确地模拟它,你需要做@patch(path.to.my_class.py)。下面是一个简短的例子来说明这一点。# demo/my_class.pyfrom shutil import copyfileclass ModuleName:    @staticmethod    def method_being_tested(source, destination):        copyfile(source, destination)# test_my_class.pyfrom unittest.mock import patchfrom 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. 阅读此处文档中所示的修补位置可能会对您有所帮助。
随时随地看视频慕课网APP

相关分类

Python
我要回答