Включить toBeCloseTo в Jest .toMatchObject

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

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

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

expect(foo.value).toBeCloseTo(Math.round(foo.value)); что-то вроде этого, наверное.
Jai 19.11.2018 07:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
10
1
2 064
1

Ответы 1

Проблема

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

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


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

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

Асимметричный сопоставитель с использованием логика от 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
  });
});

Интересно, что если false передается как второй аргумент в этой строке, то Jest v23 создает асимметричные сопоставители для всех встроенных сопоставителей, позволяющих использовать toBeCloseTo в toMatchObject. Я мог бы задать вопрос, почему там передают true.

Brian Adams 25.11.2018 06:05

Спасибо! Я добавил этот ответ в обсуждение добавления сопоставителя toBeNear к jest-extended.

Dan Dascalescu 24.02.2019 01:57

что интересно, в их документации показаны примеры асимметричного использования настраиваемый сопоставитель.

skyboyer 07.04.2019 10:07

Другие вопросы по теме