У меня есть функция в моей программе, которая перечисляет все файлы в заданном пути, и я пытаюсь написать тест, который проходит, когда в пути нет файлов (пустой вывод, т.е. []
). Я узнаю о меховом устройстве 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/')
Версия 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
, нужно будет насмехаться в другом пространстве имен!
pytest-mock
ли вы предложить, где я могу найти хорошую документацию по pytest-mock
которая проста для понимания?
mocker
просто вводит фиктивное пространство имен.
get_list
. Нам нужно посмотреть, какlistdir
используется / импортируется.