我正在测试一个对象与一组字段匹配,但是其中一个是浮点,我需要使用.toBeCloseTo。如何在一个expect中完成?

expect(foo).toMatchObject({
  bar: 'baz',
  value: ???.toBeCloseTo(5),  // TODO
});

我可以使用expect(foo.value).toBeCloseTo(5),但是我不想将逻辑分解为多个expect,每个浮点数一个。

最佳答案

问题

docs for toMatchObject 指出“您可以将属性与值或匹配器进行匹配”。

不幸的是,toBeCloseTo当前不可用作非对称匹配器,它看起来像these are the only asymmetric matchers currently provided by Jest

解决方案

如果您使用的是Jest v23或更高版本,则可以创建自己的副本,实质上是使用 toBeCloseTo 复制 expect.extend :

expect.extend({
  toBeAround(actual, expected, precision = 2) {
    const pass = Math.abs(expected - actual) < Math.pow(10, -precision) / 2;
    if (pass) {
      return {
        message: () => `expected ${actual} not to be around ${expected}`,
        pass: true
      };
    } else {
      return {
        message: () => `expected ${actual} to be around ${expected}`,
        pass: false
      }
    }
  }
});

const foo = {
  bar: 'baz',
  value: 4.9999
};

test('foo', () => {
  expect(foo.value).toBeAround(5, 3);  // SUCCESS in Jest > v20
  expect(foo).toMatchObject({
    bar: 'baz',
    value: expect.toBeAround(5, 3)  // SUCCESS only in Jest > v23
  });
});

请注意,expect.extend创建了一个匹配器,该匹配器只能在Jest v23及更高版本中在toMatchObject之类的函数中使用。

替代解决方案

Jest合作者从this post中摘录:“尽管隐含了,但目前尚未记录,但Jest断言将非对称匹配器对象评估为defined in Jasmine”。

可以使用the logic from toBeCloseTo 创建不对称匹配器,如下所示:

const closeTo = (expected, precision = 2) => ({
  asymmetricMatch: (actual) => Math.abs(expected - actual) < Math.pow(10, -precision) / 2
});

const foo = {
  bar: 'baz',
  value: 4.9999
};

test('foo', () => {
  expect(foo).toMatchObject({
    bar: 'baz',
    value: closeTo(5, 3)  // SUCCESS
  });
});

关于javascript - 在Jest .toMatchObject中包含toBeCloseTo,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53369407/

10-10 21:44