You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python mock双返回值数据库函数报not enough values to unpack错误

报错原因

你的mock没有正确生效,代码实际调用了原生的database_connection函数而非mock版本,原生函数执行异常返回None,你尝试对None做二元拆包操作,就触发了expected 2, got 0的报错。mock失效的常见原因有两个:

  1. patch路径错误:@mock.patch的规则是「patch代码实际调用处的引用」,如果你的sql_query_insert里调用的database_connection不是来自你patch的lambda_function模块,mock就不会生效。如果两个函数都定义在lambda_function.py中,这个路径是正确的。
  2. 测试方法未接收mock注入参数:unittest的@mock.patch装饰器会自动向测试方法注入mock实例作为参数,你写的测试方法只有self一个参数,没有预留参数接收该注入对象,导致mock绑定失败,原生函数没有被替换。

解决方法

按以下步骤修改测试代码即可:

  1. 给测试方法添加参数接收mock实例
  2. 构造符合业务逻辑的mock cursor和connection对象,避免后续调用execute、commit时报错
  3. 调整断言逻辑匹配函数实际返回值

正确的测试代码示例:

import unittest
from unittest import mock
import lambda_function

class TestDatabaseOps(unittest.TestCase):
    @mock.patch('lambda_function.database_connection')
    def test_sql_query_insert(self, mock_db_conn):
        # 构造mock的数据库游标和连接对象,模拟需要用到的方法
        mock_cursor = mock.MagicMock()
        mock_connection = mock.MagicMock()
        # 设置mock函数的返回值为两个对象组成的元组,满足拆包要求
        mock_db_conn.return_value = (mock_cursor, mock_connection)

        # 调用测试函数,传入符合业务逻辑的测试参数
        test_insert_field = "user_id"
        test_user_id = "10086"
        test_login_time = "2024-05-20 14:30:00"
        result = lambda_function.sql_query_insert(test_insert_field, test_user_id, test_login_time)

        # 核心断言
        self.assertEqual(result, mock_connection)
        # 可选断言:验证SQL执行、提交操作被正常调用
        mock_cursor.execute.assert_called_once()
        mock_connection.commit.assert_called_once()

if __name__ == "__main__":
    unittest.main()

内容的提问来源于stack exchange,提问作者L44TXF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:42:02