pytest mock os.listdir для возврата пустого списка

1

У меня есть функция в моей программе, которая перечисляет все файлы в заданном пути, и я пытаюсь написать тест, который проходит, когда в пути нет файлов (пустой вывод, т.е. []). Я узнаю о меховом устройстве pytest чтобы сделать это. Вот что я написал,

def test_no_dirs(mocker):
    mocker.patch('os.listdir')
    assert get_list() #get_list returns ['abc.json', 'test.json', 'test2.json']
    os.listdir.assert_called_with('/etc/app_data/',stdout=[])

Сначала я использовал mocker в качестве параметра, а затем os.listdir функцию os.listdir. os.listdir вызывается в get_list(), но я не знаю, как изменить return значение os.listdir для пустого списка, [] чтобы высмеять пустую директорию.

Когда я запускаю команду выше, я получаю следующую ошибку,

E       AssertionError: Expected call: listdir('/etc/app_data/', stdout='[]')
E       Actual call: listdir('/etc/app_data/')
E
E       pytest introspection follows:
E
E       Kwargs:
E       assert {} == {'stdout': '[]'}
E         Right contains more items:
E         {'stdout': '[]'}
E         Full diff:
E         - {}
E         + {'stdout': '[]'}

Как я могу mock os.listdir вернуть пустое значение и передать тест?

Если я удалю stdout=[], тестовый PASS но он действительно не делает то, что я хочу сделать, что нужно передать, когда нет файлов.

Что код для get_list()

import os
def get_list():
    return os.listdir('/etc/app_data/')
  • 1
    Добавьте код для get_list . Нам нужно посмотреть, как listdir используется / импортируется.
  • 0
    Я добавил код @wim спасибо
Показать ещё 2 комментария
Теги:
pytest

1 ответ

1
Лучший ответ

Версия pytest-mock должна выглядеть примерно так:

def test_no_dirs(mocker):
    mock = mocker.patch('os.listdir', return_value=[])
    result = get_list()
    assert result == []  # because that the 'return_value' mocked
    mock.assert_called_once_with('/etc/app_data/')

Обратите внимание, что пользователям, которые делают from os import listdir, нужно будет насмехаться в другом пространстве имен!

  • 0
    большое спасибо. pytest-mock ли вы предложить, где я могу найти хорошую документацию по pytest-mock которая проста для понимания?
  • 0
    Документация stdlib для макета . Обратите внимание, что приспособление mocker просто вводит фиктивное пространство имен.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню