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

