javascript - toBeCloseTo 等效于 Jest 中的递归相等性测试

标签 javascript object testing numbers jestjs

我有两个对象,我想使用 Jest 测试递归相等性。这很简单:

test('should be recursively equal', () => {
  const test = { x: 0, y: 0 }
  const expected = { x: 0, y: 0 }

  expect(test).toEqual(expected)
})

但在某些情况下会出现问题;如您所知,JavaScript 计算 float 非常糟糕,因此有时测试会变成以下内容:

test('should be recursively equal', () => {
  const test = { x: 0.00000000001, y: 0 }
  const expected = { x: 0, y: 0 }

  expect(test).toEqual(expected)
})

它不再起作用了。 Jest 提供了 toBeCloseTo 测试,它以数字和精度作为参数,但我想知道递归等式是否有等效项(类似于 toEqualCloseTo)。

最佳答案

我最终得到了以下解决方案:

expect.extend({
  toEqualCloseTo(received, expected, precision = 3) {
    const { getType } = this.utils

    function round(obj) {
      switch (getType(obj)) {
      case 'array':
        return obj.map(round)

      case 'object':
        return Object.keys(obj).reduce((acc, key) => {
          acc[key] = round(obj[key])
          return acc
        }, {})

      case 'number':
        return +obj.toFixed(precision)

      default:
        return obj
      }
    }

    expect(round(received)).toEqual(expected)

    return { pass: true }
  },
})

关于javascript - toBeCloseTo 等效于 Jest 中的递归相等性测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41060258/

相关文章:

javascript - 在 JavaScript 对象的特定位置访问和添加节点

javascript - Underscore.js 基于属性名称数组的唯一选择

使用 mockito 进行 GWT 测试

javascript - 如何为对象实例设置默认键值对?

java - 编写可测试的代码 - Junit Test

testing - racketunit 检查没有抛出异常

javascript - 使用 process.hrtime() 的执行时间返回 vaSTLy 不同的结果

javascript - Chrome 开发工具在调试 iframe contentWindow 时崩溃

javascript - Pepper 在程序运行期间崩溃

javascript - React map - 如果丢失则不要返回项目