如何对失败的文件删除进行单元测试?

How to unit-test for failed file deletion?

我的代码中有一个 os.remove(),有时在本地 运行 时,由于 OSError 13 - Permission Denied 而失败 - 因此我设置了 try-except。我的自动化测试 (Travis CI) 在 Linux VM 实例上 运行,所以我不知道如何让 os.remove 失败以覆盖。

我有哪些选择 - 如何强制执行 except 块?或者,如何使用 Python?

删除保护文件

注意:在调用测试方法之前在测试代码中删除它不是一个选项;该方法本身获取要删除的文件:

from pathlib import Path

paths = [str(x) for x in Path("directory/").iterdir() if 'abc' in x.stem]
if len(paths) > 0:  # if files are removed beforehand, len(paths) == 0
    try:
        [os.remove(p) for p in paths]
    except:
        pass  # stuff here

您可以使用 unittest.mock.patch 修补 os.remove 并将 OSError 指定为 side_effect:

from unittest.mock import patch

...

with patch('os.remove') as mock_remove:
    mock_remove.side_effect = OSError('Permission Denied')
    try:
        [os.remove(p) for p in paths]
    except OSError as e:
        pass # handle error here