假设我具有以下功能,并且需要对其进行单元测试:
def move_files_to(files, path):
for file in files:
os.rename(file, path + "/" + file)
我对此主题的看法:
模拟os.rename将不会导致任何结果,另一方面,拥有文件并重命名它们将是“正在执行I / O”,在单元测试中应避免使用。如果我错了,请纠正我。在这里进行测试有意义吗?
答案 0 :(得分:2)
我的建议是
创建一个DirectoryTestCase(unittest.TestCase)
,
_tests
下的tests/
)ii)创建一个空目录,并iii)将文件复制(测试)到该目录。 第二,在该测试用例下创建测试。您可以测试将符号链接等移动到同一目录(重命名),移动到新目录(在测试目录下,如果不存在或失败,是否应该创建?),等等,所有都在现有目录的封装下进行。
如果要并行运行测试,请为目录指定一个唯一的(随机但有效)名称。
示例代码:
import unittest
import shutil
import os
import string
import random
class DirectoryTestCase(unittest.TestCase):
test_files = ['file.txt']
def setUp(self) -> None:
unique_string = ''.join(random.choices(string.digits, k=10))
self.path = os.path.join(os.path.dirname(__file__), '_temp' + unique_string)
shutil.rmtree(self.path, ignore_errors=True)
os.makedirs(self.path, exist_ok=True)
for file in self.test_files:
shutil.copy(file, self.path)
def tearDown(self) -> None:
shutil.rmtree(self.path, ignore_errors=True)
def test_basic(self):
# validate the existence of the file, not an actual test.
self.assertTrue(os.path.exists(os.path.join(self.path, 'file.txt')))
答案 1 :(得分:1)
不需要测试os.rename
,但是需要测试您的代码。在您的特定情况下,最简单的方法是修补os.rename
:
from unittest.mock import patch
def test_move_files():
files = ['a.txt', 'b.txt']
path = 'old'
expected = [(('a.txt', 'old/a.txt'),),
(('b.txt', 'old/b.txt'),)]
with patch('os.rename') as rename:
move_files_to(files, path)
assert rename.call_args_list == expected
答案 2 :(得分:0)
由于在python中模拟OS模块很困难,因此可以忽略编写unitest
但是单元测试意味着在某些可能的情况下验证您的单一方法,因此如果您认为必须始终进行验证。那么必须进行单元测试。