Jest中toBe比对显示值相同的字符串时断言失败问题排查
问题原因
报错里两个值视觉上都是PK但断言失败,本质是控制台不会渲染不可打印的ASCII控制字符,两个字符串的实际内容并不相等:
- 你定义的预期值
'PK'是长度为2的字符串,仅包含P、K两个可打印字母 - 你截取了Buffer前4字节转字符串,而ZIP格式的标准文件头魔数前4字节为
0x50 0x4B 0x03 0x04:前两个字节对应字符P、K,后两个字节是不可打印的控制字符,转成字符串后不会在Jest的报错输出里显示,视觉上和纯PK没有区别,但实际这个返回值字符串长度是4,和长度为2的预期值用Object.is比对自然返回false。
修复方法
二选一即可:
- 方案1:调整截取长度,只取前2字节转字符串做比对,和预期值长度对齐
const zipMagicNumber: string = 'PK' // 仅截取前2个字节转字符串 const uploadedMagicNumber: string = uploadMock.mock.calls[0][0].Body.subarray(0, 2).toString() expect(zipMagicNumber).toBe(uploadedMagicNumber)
- 方案2(推荐):直接比对二进制Buffer值,跳过字符串转码步骤,这也是校验文件魔数的通用稳妥写法,不会被编码、隐式字符这类问题干扰:
// ZIP格式标准前4字节魔数 const zipMagicHeader = Buffer.from([0x50, 0x4B, 0x03, 0x04]) const uploadedHeader = uploadMock.mock.calls[0][0].Body.subarray(0, 4) expect(uploadedHeader.equals(zipMagicHeader)).toBe(true)
排查这类肉眼看不出差异的字符串问题时,直接打印字符串的
.length属性,或者把字符串转回Buffer查看字节值,就能快速定位到隐藏的不可见字符。
内容的提问来源于stack exchange,提问作者alyx
相关产品推荐
相关产品推荐

