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

如何Mock类实例的方法?单元测试调用断言失败的解决

解决Mock Cache实例get方法断言失败的问题

你的代码存在两个关键问题导致断言失败:

问题1:Mock对象初始化错误

你用Mock(b.my_cache.get)创建Mock的方式是错误的,这不是初始化Mock的正确姿势,不需要传入原方法作为参数,直接创建空Mock对象即可。

问题2:Patch的使用时机与方式有误

当b.py导入my_cache实例后,你提前创建Mock并通过装饰器绑定,可能因模块导入顺序问题,导致run_app调用的还是原get方法而非Mock对象。


修正方案1(推荐:让Patch自动创建Mock)

直接使用@patch装饰器,它会自动生成Mock对象并传入测试方法,避免引用不一致问题:

from mock import patch
import b

class MyTests():
    @patch('b.my_cache.get')
    def test_cache(self, mock_my_cache_get):
        # 注意:原run_app是静态方法,直接通过类调用更规范
        b.MyApp.run_app()
        mock_my_cache_get.assert_called_with(1, 2)

修正方案2(手动创建Mock+上下文管理器)

用with上下文管理器手动控制Patch的生效范围,确保Mock对象正确替换原方法:

from mock import Mock, patch
import b

mock_my_cache_get = Mock()

class MyTests():
    def test_cache(self):
        with patch('b.my_cache.get', mock_my_cache_get):
            b.MyApp.run_app()
            mock_my_cache_get.assert_called_with(1, 2)

额外注意:原b.py中MyApp的run_app方法定义为无参静态方法,调用时不需要实例化类,直接用b.MyApp.run_app()即可(实例化调用虽不报错,但不符合静态方法的使用规范)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:02:24