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

使用create_autospec测试类方法时内部调用断言失败问题

问题原因与解决方案

问题根源

你用create_autospec(X)创建的是X类的mock对象,这个对象的所有方法(包括get_data)都是被替换后的空mock实现,完全不会执行你在X类中定义的get_data逻辑。所以调用mock.get_data()时,只是增加了这个mock方法的调用计数,根本不会触发原方法里的get_data_from_friend()调用,自然会断言失败。

正确的测试方式

要验证get_data内部的调用逻辑,你需要让get_data执行原类的代码,同时mock它依赖的方法或外部资源。这里提供两种常用方案:

方案1:实例化真实X类,mock内部方法

def test_get_data(self):
    # mock数据库依赖(假设你的DB类是实际的数据库操作类)
    mock_db = create_autospec(DB)
    # 创建真实的X类实例
    x = X(mock_db)
    
    # mock get_data_from_friend方法,指定返回值
    x.get_data_from_friend = create_autospec(x.get_data_from_friend, return_value=None)
    # 调用待测试方法
    x.get_data()
    
    # 验证内部方法调用
    x.get_data_from_friend.assert_called_once()
    x.get_data_from_db.assert_called_once()

方案2:用patch.object替换类的内部方法

from unittest.mock import patch

def test_get_data(self):
    mock_db = create_autospec(DB)
    
    # 临时替换X类的两个内部方法为mock
    with patch.object(X, 'get_data_from_friend', return_value=None) as mock_friend, \
         patch.object(X, 'get_data_from_db') as mock_db_method:
        x = X(mock_db)
        x.get_data()
        
        mock_friend.assert_called_once()
        mock_db_method.assert_called_once()

补充说明

如果需要测试get_data在get_data_from_friend返回非None值时的逻辑,只需修改mock的return_value为具体数据,然后验证get_data_from_db不会被调用即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:02:40