Как имитировать существование определенного файла в модульном тестировании Python?

#python #unit-testing #nose #python-unittest

#python #модульное тестирование #нос #python-unittest

Вопрос:

Я пишу модульный тест для встроенного программного кода на Python.

Для одного из файлов требуется существование определенного файла. (например, «/dir_name/file_name.txt «) в противном случае возникает ошибка.

Обычно этот файл существует на аппаратном устройстве, и мой код python считывает этот файл. При написании модульных тестов для кода Python, как я могу имитировать существование файла?

tempfile.mkstemp() похоже, что не генерируется точный путь / имя файла, которое я хочу, а именно /dir_name/file_name.txt . Он всегда добавляет несколько случайных букв.

Это с Python3.4. Возможно ли выполнить это с unittest.mock ?

Комментарии:

1. Вам действительно нужно, чтобы этот штраф существовал? Или или вы спрашиваете, как вы можете высмеять это так, чтобы то, что вы тестируете, думало , что оно существует? Можете ли вы предоставить образец вашего кода и то, что вы тестируете? Я думаю, у меня есть идея, но я хотел бы посмотреть, каков ваш текущий подход.

2. Нет, ему не обязательно существовать. Пока я могу заставить свой код верить , что файл существует, все в порядке.

3. Отлично. Можете ли вы показать часть кода, чтобы узнать, как обслуживать решение? Здесь есть разные варианты, но было бы здорово посмотреть, каков ваш текущий подход, чтобы знать, как предложить более релевантное решение.

4. Еще одна сложность заключается в том, что это происходит, когда я делаю import module_A . Когда я делаю это import , для этого требуется файл (или нам нужно заставить его поверить, что файл существует), и это немного сложно… import module_A здесь возникает исключение, если файл не существует.

5. Это потому, что вы устанавливаете свой файл в глобальном пространстве? Если вы это сделаете, любой код, который находится в этом пространстве, будет выполнен при импорте модуля.

Ответ №1:

Вы могли бы создать контекстный менеджер, который создает и удаляет файл.

 from contextlib import contextmanager

@contextmanager
def mock_file(filepath, content=''):
    with open(filepath, 'w') as f:
        f.write(content)
    yield filepath
    try:
        os.remove(filepath)
    except Exception:
        pass


def test_function():
    with mock_file(r'/dirname/filename.txt'):
        function()