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

如何用Mock验证pytest中__init__参数且不执行原方法?

正确验证Foo类__init__参数的pytest方案

你遇到的问题本质是两个:一是__init__方法强制要求返回None,不能给mock设置非None的return_value;二是mock的调用断言需要匹配正确的参数(包括self)或者用更简单的类patch方式。

下面给两种可行的解决方法:

方法一:直接patch __init__方法

核心是不给__init__的mock设置return_value(或者显式设为None),同时断言时处理self参数:

from unittest.mock import ANY
import pytest
from my_module import Foo  # 替换成你的Foo类所在模块

def test_foo_init_args(mocker):
    # 正确patch Foo的__init__,return_value必须是None(默认就是None,可不写)
    mock_init = mocker.patch('my_module.Foo.__init__', return_value=None)
    
    # 创建实例,此时__init__不会执行实际逻辑
    foo = Foo(10, "hello")
    
    # 断言__init__被正确调用:第一个参数是实例本身,用ANY匹配即可
    mock_init.assert_called_once_with(ANY, 10, "hello")

方法二:patch整个Foo类(更简洁)

直接mock整个Foo类,这样创建实例时本质是调用mock类,断言类的构造参数即可,不用关心__init__的self细节:

import pytest
from my_module import Foo

def test_foo_init_args_simpler(mocker):
    # patch整个Foo类
    mock_foo_cls = mocker.patch('my_module.Foo')
    
    # 调用构造方法(实际是调用mock类)
    foo = Foo(10, "hello")
    
    # 直接断言类的调用参数,和你传入的参数完全一致
    mock_foo_cls.assert_called_once_with(10, "hello")

错误原因解析

  1. TypeError问题:Python规定__init__必须返回None,你给mock设置return_value=Mock()会返回非None对象,触发解释器的强制检查。
  2. 断言失败问题:要么是patch的路径错误(比如没写全模块路径,导致mock没生效),要么是断言时没包含self参数(__init__的第一个参数是实例本身,直接断言传入的参数会不匹配)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:15:07