Python单元测试中Mock pymysql.connect返回None如何正确配置?
错误原因
你遇到的报错核心是Mock配置和传参不符合原函数的调用逻辑,具体问题有两点:
- 传参不匹配:你调用
does_table_exist时传入的第一个参数是被Mock的pymysql.connect方法,但函数要求的是已经实例化的数据库连接对象,参数类型完全错误。 - Mock层级错误:你将
cursor.return_value设为返回1的execute模拟对象,不符合实际调用逻辑:原函数中with conn.cursor() as cur拿到的cur是游标实例,需要这个实例本身具备execute方法,且该方法返回1。
之前的配置下cur.execute(sql)无法拿到预期的返回值1,两个条件判断都未触发,所以函数直接返回了初始值None。
正确测试代码
def test_check_table_exists(init): # 构造模拟的数据库连接对象 mock_conn = MagicMock() # 构造模拟游标,配置execute方法返回1 mock_cursor = MagicMock() mock_cursor.execute.return_value = 1 # 适配with conn.cursor()的上下文管理器逻辑 mock_conn.cursor.return_value.__enter__.return_value = mock_cursor # 传入符合要求的模拟连接调用测试函数 response = init.does_table_exist(mock_conn, 'test') assert response == True
补充说明
如果需要测试表不存在的场景,只需要把mock_cursor.execute.return_value改为0即可,断言修改为assert response == False。
内容的提问来源于stack exchange,提问作者user2993021
相关产品推荐
相关产品推荐

