gpt4 book ai didi

Python 模拟不适用于 shutil.rmtree

转载 作者:行者123 更新时间:2023-11-28 20:27:30 25 4
gpt4 key购买 nike

我有一个类,该类使用 shutil.rmtree 来删除一些文件,如果参数被传递为 true,如何模拟此行为,以便其他测试不会中断需要这些文件。

我的类(class)是这样的——

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

现在我的测试看起来像 -

class TestFileConverter(unittest.TestCase):

def test_convert_success(self):
input_dir = 'resources/files'
file_converter = FileConverter(input_dir)
file_converter.convert_files()

# assert the things from doStuff

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

self.assertEquals(rm_mock, [call(input_dir)])

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

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

第一个测试给了我找不到文件的错误,因为模拟没有工作并且 rmv 源测试删除了文件

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

如果我用 rmv_source true 注释掉第二个测试,那么我的第一个测试就可以正常工作。我在这里做错了什么?

最佳答案

您的模块已经导入了 shutil.rmtree,所以稍后在测试套件中模拟它不会做任何事情。

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

import sys
from mock import MagicMock

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

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

import sys
from mock import MagicMock

import shutil as shutil_orig
sys.modules['shutil'] = MagicMock()
import shutil

print(type(shutil_orig.rmtree))
# <class 'function'>
print(type(shutil.rmtree))
# <class 'mock.mock.MagicMock'>

关于Python 模拟不适用于 shutil.rmtree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49378459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com