从 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.
可能会对您有所帮助
这需要花费很多时间才能弄清楚,但我正在尝试模拟 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.