首页 > 解决方案 > pytest mock os.listdir 返回空列表

问题描述

我的程序中有一个函数可以列出给定路径中的所有文件,并且我正在尝试编写一个测试,该测试在提供的路径中不存在文件时通过(空输出,即)[]我正在学习 mocker 夹具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被调用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': '[]'}

如何模拟os.listdir返回空值并通过测试?

如果我删除stdout=[],测试PASS但它并没有真正做我想做的事情,即在没有文件时通过。

那是代码get_list()

import os
def get_list():
    return os.listdir('/etc/app_data/')

标签: pythonpytest

解决方案


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将需要在不同的命名空间中进行模拟!


推荐阅读