python - 迭代 Mock 返回值
问题描述
我正在尝试模拟返回列表的方法。设置后return_value
,它仍然返回一个 Mock 对象而不是列表,所以我不能迭代那个对象。
我要测试的功能示例:
def func(db_engine):
query = f"SELECT * FROM table"
query_result = db_engine.execute(query).fetchall()
extracted_val = []
for res in query_result:
extracted_val.append(res[1])
return extracted_val
测试示例:
def test_fun():
query = MagicMock()
query_res = [("name_1", "value_1"), ("name_2", "value_2")]
expected_vals = ["value_1", "value_2"]
db_engine = MagicMock()
db_engine.execute(query).fetchall().return_value = query_res
vals = func(db_engine)
assert expected_vals == vals
总之,db_engine.execute(query).fetchall()
必须返回列表,所以我可以迭代query_result
,但它不会发生。尽管在attributequery_result
中有正确的值return_value
,但我无法对其进行迭代。
解决方案
您可以在此处找到如何模拟链式调用文档。这是单元测试解决方案:
func.py
:
def func(db_engine):
query = f"SELECT * FROM table"
query_result = db_engine.execute(query).fetchall()
extracted_val = []
for res in query_result:
extracted_val.append(res[1])
return extracted_val
test_func.py
:
import unittest
from func import func
from unittest.mock import MagicMock
class TestFunc(unittest.TestCase):
def test_func(self):
query_res = [("name_1", "value_1"), ("name_2", "value_2")]
expected_vals = ["value_1", "value_2"]
db_engine = MagicMock()
execute = db_engine.execute.return_value
execute.fetchall.return_value = query_res
vals = func(db_engine)
db_engine.execute.assert_called_with("SELECT * FROM table")
execute.fetchall.assert_called_once()
self.assertEqual(expected_vals, vals)
if __name__ == '__main__':
unittest.main()
覆盖率 100% 的单元测试结果:
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Name Stmts Miss Cover Missing
-----------------------------------------------------------------------
src/stackoverflow/61318070/func.py 7 0 100%
src/stackoverflow/61318070/test_func.py 16 0 100%
-----------------------------------------------------------------------
TOTAL 23 0 100%
蟒蛇版本:Python 3.7.5
推荐阅读
- rocket.chat - 是否可以在没有 ee 目录(没有企业代码)的情况下启动和构建 Rocket.Chat?
- jquery - jQuery Window 滚动问题与 Locomotive Scroll 在同一页面上
- java - 如何在 Elasticsearch 中管理值的自动排序
- c++ - const_iterator 的 ++ 运算符如何用于向量
在 C++ 标准库中? - python - 如何使用 H2o 库获取 GBM 模型上的数据
- flutter - 在 Flutter DropdownButtonFormField 中获取多个值
- c++ - 为什么 fftw 在 vscode 中总是未定义的引用?
- docker - Docker - 无论框架如何设置多个项目(在 php 上)
- c# - Shaded pictures on focused item in collection view
- python - 最多 X 个值的平均值,然后与最后一个值取平均值?