Issue
The 文档用于toMatchObject https://jestjs.io/docs/en/expect#tomatchobjectobject声明“您可以将属性与值或匹配器进行匹配”。
很遗憾,toBeCloseTo
目前不可用作非对称匹配器,它看起来像这些是 Jest 目前提供的唯一不对称匹配器 https://github.com/facebook/jest/blob/c01b4c75a2f65e9fa122adf69b0ac11875f1fc74/packages/expect/src/index.js#L324-L337.
Solution
如果您使用 Jest v23 或更高版本,您可以创建自己的,本质上是复制toBeCloseTo https://github.com/facebook/jest/blob/c01b4c75a2f65e9fa122adf69b0ac11875f1fc74/packages/expect/src/matchers.js#L87-L102 using expect.extend https://jestjs.io/docs/en/expect#expectextendmatchers:
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 及更高版本。
替代解决方案
From 这个帖子 https://github.com/facebook/jest/issues/4711#issuecomment-337236678一位 Jest 合作者:“虽然这是暗示的,但是目前没有记录,玩笑断言将非对称匹配器对象评估为茉莉花中定义 https://jasmine.github.io/tutorials/your_first_suite#section-Custom_asymmetric_equality_tester".
不对称匹配器使用逻辑来自toBeCloseTo https://github.com/facebook/jest/blob/c01b4c75a2f65e9fa122adf69b0ac11875f1fc74/packages/expect/src/matchers.js#L90可以这样创建:
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
});
});