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

Python单元测试中被mock的对象构造函数仍被调用该如何解决?

问题解答

认知正误判断

你的原有认知是错误的。你当前仅patch了SomeAuthorizer的is_authorized实例方法,类本身没有被mock替换,代码执行到authorizer = SomeAuthorizer()时仍然会调用真实的__init__构造函数,触发依赖环境变量的第三方客户端初始化逻辑,因此未配置对应环境的开发者运行测试会报错。

解决方案

推荐按优先级选择以下方案:

  • 方案1:直接Mock整个SomeAuthorizer类(最常用,适配性最高)
    注意需遵循「patch使用处,而非定义处」的规则,即如果你在some_handler.py中是通过from some_authorizer import SomeAuthorizer引入的类,就需要patchsome_handler.SomeAuthorizer,示例代码如下:

    from unittest.mock import patch
    
    @patch("some_handler.SomeAuthorizer")
    def test_authorization_request_not_authorized(self, mock_authorizer_cls):
        # 配置Mock类生成的实例的is_authorized返回值
        mock_authorizer = mock_authorizer_cls.return_value
        mock_authorizer.is_authorized.return_value = False
          
        response = handle_request(test_event("test_user", "testing"))
        assert response == status_code(200, False)
    

    该方案下SomeAuthorizer会被完全替换为Mock对象,实例化时不会执行真实的构造函数逻辑,无需依赖本地环境变量。

  • 方案2:同时Mock构造函数和目标方法(仅适合临时快速修改场景)
    如果你不想修改现有逻辑仅mock方法,可以额外把__init__方法mock为无操作逻辑:

    from unittest.mock import patch
    
    @patch.object(SomeAuthorizer, "__init__", return_value=None)
    @patch.object(SomeAuthorizer, "is_authorized", return_value=False)
    def test_authorization_request_not_authorized(self, mock_is_authorized, mock_init):
        response = handle_request(test_event("test_user", "testing"))
        assert response == status_code(200, False)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:00:01