You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中Mock字典报错:NoneType无items_dict属性求助

解决Mock/Patch中的AttributeError问题

嘿,我来帮你搞定这个问题~

你遇到的AttributeError: 'NoneType' object has no attribute 'items_dict',根源很明确:你用obj = Foo(None)创建实例时,Foo类的__init__方法默认把bar设为None,所以obj.bar就是None,自然没法访问它的items_dict属性,patch操作也就失败了。

下面给你两种可行的解决思路:

思路1:创建实例时传入一个带items_dict的mock对象

既然create_css_for_imgs()需要bar.items_dict,那我们在初始化Foo的时候,就给它传一个预先mock好的bar对象,而不是None:

from unittest.mock import Mock, patch

# 先构造一个mock的bar对象,确保它有items_dict属性
mock_bar = Mock()
mock_bar.items_dict = {}  # 初始化空字典,方便后续patch

# 用这个mock_bar创建Foo实例
obj = Foo(mock_bar)

# 现在就能正常patch字典了
with patch.dict(obj.bar.items_dict, {TEST_DIR + '/Transparent.gif': data}):
    obj.create_css_for_imgs()

思路2:给已创建的实例的bar属性补一个mock对象

如果你必须用Foo(None)创建实例(比如测试边界场景),那可以在patch之前,给obj.bar手动赋值一个带有items_dict的mock对象:

from unittest.mock import Mock, patch

obj = Foo(None)

# 给obj.bar补上一个mock对象,添加items_dict属性
obj.bar = Mock()
obj.bar.items_dict = {}

# 接下来正常执行patch和方法调用
with patch.dict(obj.bar.items_dict, {TEST_DIR + '/Transparent.gif': data}):
    obj.create_css_for_imgs()

另外还要提醒你一个小细节:你原来的patch代码里写了{TEST_DIR + '/Transparent.gif', data},这是集合的语法,而patch.dict需要的是字典(键值对),所以要改成{TEST_DIR + '/Transparent.gif': data},不然会触发语法错误哦~

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

火山引擎 最新活动