Я проверяю, соответствует ли объект набору полей, но одно из них - с плавающей запятой, и мне нужно использовать .toBeCloseTo. Как это можно сделать в рамках одного ожидать?
expect(foo).toMatchObject({
bar: 'baz',
value: ???.toBeCloseTo(5), // TODO
});
Я мог бы использовать expect(foo.value).toBeCloseTo(5), но я не хочу разбивать логику на несколько expect, по одному для каждого числа с плавающей запятой.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В документы для 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.
Спасибо! Я добавил этот ответ в обсуждение добавления сопоставителя toBeNear к jest-extended.
Мысли о общий случай использования сопоставителей в .toMatchObject?
что интересно, в их документации показаны примеры асимметричного использования настраиваемый сопоставитель.
expect(foo.value).toBeCloseTo(Math.round(foo.value));что-то вроде этого, наверное.