Jest测试BRL货币格式化函数时值看似一致仍报断言错误
问题产生原因
控制台打印的两个值视觉上完全一致但断言失败,本质是两个字符串包含视觉不可见的差异字符:toLocaleString 按照pt-BR地区规则格式化BRL货币时,R$符号与后续数字之间插入的不是普通半角空格(Unicode 编码 U+0020,键盘直接敲出的空格),而是不间断空格(Unicode 编码 U+00A0)。这种空格的作用是避免排版时货币符号和数字被拆分到两行,视觉上和普通空格没有任何区别,控制台日志无法直接显示二者差异,但toBe断言基于Object.is做严格相等判断,字符编码不同就会判定不相等。
你可以通过打印两个字符串的字符编码快速验证这个差异:
// 格式化返回值中R$后的字符编码 console.log(formattedValue.charCodeAt(2)) // 输出160,对应U+00A0不间断空格 // 手动写的预期值中R$后的字符编码 console.log('R$ 9.000,00'.charCodeAt(2)) // 输出32,对应U+0020普通空格
解决方法
任选以下一种方案即可修复问题:
- 方案1:在预期值中使用正确的不间断空格
直接将断言里的普通空格替换为不间断空格,可以用Unicode转义写法避免复制出错:test('Should format the number 9000 and return R$ 9.000,00', () => { const value = 9000; const formattedValue = brlCurrencyFormatting(value); // \xa0 是U+00A0不间断空格的16进制转义写法 expect(formattedValue).toBe('R$\xa09.000,00'); }); - 方案2:比对前统一标准化空格字符
如果不想记忆特殊字符编码,可以在断言前把格式化结果里的不间断空格全部替换为普通空格,再和手动写的预期值比对:test('Should format the number 9000 and return R$ 9.000,00', () => { const value = 9000; const formattedValue = brlCurrencyFormatting(value).replace(/\xa0/g, ' '); expect(formattedValue).toBe('R$ 9.000,00'); }); - 方案3:直接以实际运行返回的原始字符串作为预期值
首次运行测试时控制台会打印Received对应的原始字符串,直接复制该字符串替换测试用例里手动敲的预期值即可,不需要手动修改特殊字符。
内容的提问来源于stack exchange,提问作者iWozzming
相关产品推荐
相关产品推荐

