我的程序中有一个列出给定路径中所有文件的函数,并且我尝试编写一个测试,当所提供的路径中不存在任何文件时通过测试(空输出,即[]
),我正在学习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=[])
我首先使用过嘲讽作为参数,然后修补了os.listdir
函数。 os.listdir
在get_list()
中被调用,但是我不知道如何将return
的{{1}}值更改为空列表,将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': '[]'}
以返回空值并通过测试?
如果我删除了os.listdir
,则测试stdout=[]
却没有真正完成我想做的事情,那就是在没有文件的情况下通过测试。
这是PASS
get_list()
答案 0 :(得分:1)
pytest-mock
版本应如下所示:
def test_no_dirs(mocker):
mock = mocker.patch('os.listdir', return_value=[])
result = get_list()
assert result == [] # because that's the `return_value` mocked
mock.assert_called_once_with('/etc/app_data/')
请注意,执行from os import listdir
的用户将需要在其他名称空间中进行模拟!