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

如何Mock City类对象,跳过构造函数且保留原有字段与方法?

解决方案:Mock类但保留原有属性与方法,避免构造函数执行

首先纠正你测试代码里的一个问题:City类的street是实例方法,不能直接通过类调用,必须先实例化对象后才能调用。

要实现「Mock整个类以跳过构造函数执行,同时保留原类的字段和方法功能」,可以通过以下几种方式实现:

方法一:创建Mock实例并绑定原方法/属性

from unittest.mock import patch, Mock
from classes import City

def test_city():
    # 构造一个Mock实例,绑定原类的方法和属性
    mock_city_instance = Mock()
    mock_city_instance.street = lambda: City.street(mock_city_instance)
    mock_city_instance.field = City.field

    # Mock整个City类,让它返回我们构造好的实例
    with patch("classes.City", return_value=mock_city_instance):
        # 实例化City时,不会执行原__init__里的some_action()
        city = City()
        # 验证方法和属性的原有功能
        assert city.street() == "aaa"
        assert city.field == "bbb"

方法二:结合create_autospec保留类结构

create_autospec可以自动生成与原类结构一致的Mock,避免误调用不存在的方法,同时我们可以替换构造函数跳过原逻辑:

from unittest.mock import patch, create_autospec
from classes import City

@patch("classes.City", new_callable=lambda: create_autospec(City))
def test_city(mock_city_cls):
    # 替换原构造函数,避免执行some_action()
    mock_city_cls.__init__ = Mock(return_value=None)
    # 保留原类的field属性
    mock_city_cls.field = City.field

    # 实例化Mock类
    city = City()
    # 让实例的street方法使用原逻辑
    city.street = lambda: City.street(city)

    assert city.street() == "aaa"
    assert City.field == "bbb"
    # 可选:验证构造函数被调用
    mock_city_cls.__init__.assert_called_once_with(city)

方法三:直接Mock构造函数

如果只需要跳过构造函数,其他方法和属性保留原逻辑,可以直接Mock__init__方法:

from unittest.mock import patch
from classes import City

@patch.object(City, "__init__", return_value=None)
def test_city(mock_init):
    # 实例化时不会执行原__init__的some_action()
    city = City()
    # 原方法和属性不受影响
    assert city.street() == "aaa"
    assert City.field == "bbb"
    # 验证构造函数被调用
    mock_init.assert_called_once_with(city)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:45:38