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




