Python mock双返回值数据库函数报not enough values to unpack错误
报错原因
你的mock没有正确生效,代码实际调用了原生的database_connection函数而非mock版本,原生函数执行异常返回None,你尝试对None做二元拆包操作,就触发了expected 2, got 0的报错。mock失效的常见原因有两个:
- patch路径错误:
@mock.patch的规则是「patch代码实际调用处的引用」,如果你的sql_query_insert里调用的database_connection不是来自你patch的lambda_function模块,mock就不会生效。如果两个函数都定义在lambda_function.py中,这个路径是正确的。 - 测试方法未接收mock注入参数:
unittest的@mock.patch装饰器会自动向测试方法注入mock实例作为参数,你写的测试方法只有self一个参数,没有预留参数接收该注入对象,导致mock绑定失败,原生函数没有被替换。
解决方法
按以下步骤修改测试代码即可:
- 给测试方法添加参数接收mock实例
- 构造符合业务逻辑的mock cursor和connection对象,避免后续调用
execute、commit时报错 - 调整断言逻辑匹配函数实际返回值
正确的测试代码示例:
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
相关产品推荐
相关产品推荐

