如何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
相关产品推荐
相关产品推荐

