pytest模拟os.listdir返回空列表

时间:2018-09-24 21:44:21

标签: python pytest

我的程序中有一个列出给定路径中所有文件的函数,并且我尝试编写一个测试,当所提供的路径中不存在任何文件时通过测试(空输出,即[]),我正在学习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.listdirget_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()

1 个答案:

答案 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的用户将需要在其他名称空间中进行模拟!