python - 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/')
解决方案
该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
将需要在不同的命名空间中进行模拟!
推荐阅读
- java - PayPal API 设置返回 URL
- apify - 尝试使用 apify web-scraper actor 抓取页面标题时出现错误 403
- gitlab-ci - 使用插件 frontend-maven-plugin 缓存节点模块库
- sql - 如何查询 2 个表,但其中一行可能为空?
- java - 一旦在物理设备中运行,它就会迅速关闭
- php - 如何在 php8.0 中编译 php 模块,该模块曾经在 php7 中使用 TSRMLS_CC,但在 php8.0 中已弃用
- python - 将 Python 输出存储到 csv 文件?
- python - 在 Pytorch 中使用 torch.Tensor 构造函数创建张量时使用什么分布?
- ansible - 如何在 Ansible 中的远程节点上执行 python 程序
- c# - 如何在“”之间使用剃刀模板