如何让Magic Mock模拟对象的方法调用时返回指定值?
问题分析与解决方案
你的问题出在模拟对象的层级关系处理错误:业务代码中是通过db.cursor()调用方法获取游标实例,再调用游标上的getbatcherrors();但你当前直接给db.cursor(方法本身)绑定了getbatcherrors的返回值,这和实际调用逻辑完全不匹配,导致设置的返回值不会被触发。
修正后的测试代码
def test_function(self): # 1. 先模拟游标对象 mock_cursor = mock.MagicMock() # 2. 给游标设置getbatcherrors的返回值,触发错误分支 mock_cursor.getbatcherrors.return_value = ["test", "1", "2"] # 3. 让数据库连接对象的cursor()方法返回这个模拟游标 db = mock.MagicMock(spec=['cursor']) db.cursor.return_value = mock_cursor query = "insert SQL query here" result = function_to_test(db, query) self.assertFalse(result) # 可选:验证executemany的调用是否符合预期 mock_cursor.executemany.assert_called_once_with(query, batcherrors=True)
核心逻辑说明
- 业务代码的执行链是:
db.cursor()→ 获取游标实例 → 调用实例的executemany()和getbatcherrors() - 你之前的写法
db.cursor.getbatcherrors.return_value,是给db.cursor这个方法对象添加属性,而非给db.cursor()返回的游标实例添加,所以业务代码中的cursor.getbatcherrors()不会读取到你设置的返回值。
内容的提问来源于stack exchange,提问作者Alpheaus Feltham
相关产品推荐
相关产品推荐

