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
});
});