如何用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")
错误原因解析
- TypeError问题:Python规定
__init__必须返回None,你给mock设置return_value=Mock()会返回非None对象,触发解释器的强制检查。 - 断言失败问题:要么是patch的路径错误(比如没写全模块路径,导致mock没生效),要么是断言时没包含
self参数(__init__的第一个参数是实例本身,直接断言传入的参数会不匹配)。
内容的提问来源于stack exchange,提问作者ealeon
相关产品推荐
相关产品推荐

