Включить toBeCloseTo в Jest .toMatchObject - PullRequest
0 голосов
/ 19 ноября 2018

Я проверяю, что объект соответствует набору полей, но одно из них является плавающей точкой, и мне нужно использовать .toBeCloseTo .Как это можно сделать в течение одного ожидания ?

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

Я мог бы использовать expect(foo.value).toBeCloseTo(5), но я не хочу разбивать логику на несколько expect с, один длякаждое число с плавающей запятой.

1 Ответ

0 голосов
/ 25 ноября 2018

Issue

В документах для toMatchObject указано «Вы можете сопоставлять свойства со значениями или с сопоставителями».

К сожалению, toBeCloseTo в настоящее время недоступнокак асимметричный сопоставитель, похоже, что это единственные асимметричные сопоставители, в настоящее время предоставляемые Jest .


Solution

Если вы используете 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 создает сопоставление, которое можно использовать в функцияхкак toMatchObject только в Jest v23 и выше.


Альтернативное решение

С этот пост сотрудником Jest: "Хотя это подразумевается, но в настоящее время не задокументировано , утверждения Jest оценивают объекты асимметричного сопоставления как , определенные в Jasmine".

Асимметричное сопоставление с использованием логики из 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
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...