Как выполнить юнит-тест для неудачного удаления файла? - PullRequest
1 голос
/ 07 апреля 2020

В моем коде есть os.remove(), который иногда, при локальном запуске, дает сбой из-за OSError 13 - Permission Denied - поэтому я настроил try-except. Мое автоматическое тестирование (Travis CI) выполняется на Linux экземплярах виртуальных машин, поэтому я не знаю, как заставить 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

1 Ответ

1 голос
/ 07 апреля 2020

Вы можете использовать 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
...