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
相关产品推荐
相关产品推荐

