Python模拟无法对shutil.rm起作用

2024-06-26 15:01:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类,它使用舒蒂尔.rmtree若要删除某些文件(如果param被传递为true),如何模拟此行为,以便其他测试不中断需要这些文件的测试。在

我的班级看起来像这样-

class FileConverter(object):

    def __init__(self, path_to_files):
        self._path_to_files = path_to_files

    def convert_files(self, rmv_src=False):
        doStuff()
        if rmv_src:
            shutil.rmtree(self.__path_to_files)

    def doStuff():
        # does some stuff

现在我的测试看起来-

^{pr2}$

现在,当我运行这个测试套件时,使用rmv的测试会给我assertionError

<MagicMock name='rmtree' id='139676276822984'> != [call('resources/images')]

第一个测试给了我文件找不到错误,因为mock不起作用,rmv源代码测试删除了这个文件

FileNotFoundError: [Errno 2] No such file or directory: 'resources/images'

如果我用rmv_source true注释掉第二个测试,那么我的第一个测试工作得很好。 我做错什么了?在


Tags: 文件topathselfsrctrueparamdef
2条回答

您的模块已经导入了shutil.rmtree,因此稍后在测试套件中对其进行模拟不会起任何作用。在

您需要在导入FileConverter时模拟模块,而不是之后。在

import sys
from mock import MagicMock

sys.modules['shutil'] = MagicMock()
# and/or
sys.modules['shutil.rmtree'] = MagicMock()
import FileConverter

如果您仍然需要在测试代码中使用shutil,请首先使用别名导入它,并在需要“real”模块时使用该别名:

^{pr2}$

除了call(input_dir)对我不起作用外,原来的帖子应该有用

@mock.patch('shutil.rmtree')
def test_convert_with_rmv(self, rm_mock):
    input_dir = 'resources/files'

    rm_mock.return_value = 'REMOVED'
    file_converter = FileConverter(input_dir)
    file_converter.convert_files(True)
    rm_mock.assert_called_with(input_dir)
    self.assertEqual(rm_mock.return_value, 'REMOVED')

test_convert_with_rmv无法删除input_dir,它可能一开始就没有创建过。您可以在调用convert_files前后的每个测试中断言此语句:

^{pr2}$

相关问题 更多 >