单元测试断言错误:看似完全相同的BlockType.CODE枚举实例被判定为不同
单元测试断言错误:看似完全相同的BlockType.CODE枚举实例被判定为不同
我太懂你这种困惑了——明明打印出来的两个BlockType.CODE看起来一模一样,单元测试却死咬着说它们不一样,这简直像在玩文字游戏!别着急,这种问题的根源其实很典型,咱们一步步拆解:
问题本质:同一个枚举类被当成了两个不同的类对象
你看到的<BlockType.CODE: 'code'>只是枚举实例的字符串表示,但Python判断两个枚举实例是否相等,首先要看它们是不是同一个枚举类的实例。而你的情况里,测试代码和业务代码导入的BlockType,其实是两个完全不同的类!
为什么会出现这种情况?看你的导入路径和运行命令
你运行测试的命令是:
PYTHONPATH=src py -m unittest discover -s src/markdown -p "test_block*"
这里你把src目录加到了Python的模块搜索路径里,这意味着Python会把src当成根模块目录。
但你的导入代码却不一致:
- 在
block_parser.py里,你用的是:from core import BlockType——这是正确的,Python会从src(PYTHONPATH根)找到core模块。 - 但在测试文件里,你用的是:
from src.core import BlockType——这相当于让Python在src目录下再找一个src子目录,然后导入里面的core模块。如果你的项目结构里没有嵌套的src/src,这其实会导致Python重新加载core模块,生成一个全新的BlockType类对象!
解决方案:统一导入路径
把测试文件里的导入语句改成和业务代码一致的写法就行:
# 测试文件里的导入修改成这样 from core import BlockType
修改后,测试代码和block_parser导入的就是同一个BlockType类了,对应的CODE枚举实例自然就会相等。
验证方法(可选)
如果你想确认这个问题,可以在测试代码和block_parser.py里分别加上一行打印:
# 在测试文件里 print(id(BlockType), id(BlockType.CODE)) # 在block_parser.py里 print(id(BlockType), id(BlockType.CODE))
运行测试后你会发现,两边打印的内存地址完全不同——这就实锤了是两个不同的类。
备注:内容来源于stack exchange,提问作者Fernando Castro
相关产品推荐
相关产品推荐

