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

单元测试断言错误:看似完全相同的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:53:05