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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:48:19