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

Jest中如何对mock调用参数内的浮点数实现模糊匹配校验

你可以通过自定义Jest不对称匹配器实现该需求,无需依赖第三方包,实现成本极低:

1. 实现自定义匹配器

在Jest的全局初始化文件(通常为jest.setup.js/jest.setup.ts)中添加如下代码:

expect.extend({
  // precision 默认设为2位小数,可按需调整默认值
  numberCloseTo(expected, precision = 2) {
    return {
      // 核心匹配逻辑
      asymmetricMatch(actual) {
        if (typeof actual !== 'number') return false;
        const allowedError = 1 / (Math.pow(10, precision)) / 2;
        return Math.abs(expected - actual) < allowedError;
      },
      // 测试不通过时的提示文案
      toString() {
        return `numberCloseTo(expected: ${expected}, precision: ${precision})`;
      }
    };
  }
});

2. TypeScript 类型适配(非TS项目可跳过)

在项目的类型声明文件(如jest.d.ts)中添加类型定义,避免TS报错:

declare global {
  namespace jest {
    interface Expect {
      /**
       * 匹配符合精度要求的数字
       * @param expected 期望的数值
       * @param precision 精度(小数点后保留的位数,默认2位)
       */
      numberCloseTo(expected: number, precision?: number): unknown;
    }
  }
}

export {};

3. 使用示例

完全符合你期望的调用形式,也支持嵌套复杂结构的校验:

// 基础用法
expect(f).toHaveBeenCalledWith(
  expect.objectContaining({
    x: expect.numberCloseTo(1, 1), 
    y: expect.numberCloseTo(1, 1)
  })
);

// 嵌套结构用法
expect(f).toHaveBeenCalledWith(
  expect.objectContaining({
    position: expect.objectContaining({
      x: expect.numberCloseTo(3.1415, 3),
      y: expect.numberCloseTo(2.7182, 3)
    }),
    id: expect.any(String)
  })
);

内容的提问来源于stack exchange,提问作者Aleksandar Dimitrov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:36:02