使用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
相关产品推荐
相关产品推荐

