From 2571b49d684f811792a830699e007dc9a0cf7622 Mon Sep 17 00:00:00 2001 From: Nick Farina Date: Thu, 2 Feb 2017 16:29:07 -0800 Subject: [PATCH] Support asymmetric matching in `toMatchObject` (#2787) --- .../__snapshots__/matchers-test.js.snap | 58 +++++++++++++++++++ .../src/__tests__/matchers-test.js | 4 ++ packages/jest-matchers/src/jasmine-utils.js | 1 + packages/jest-matchers/src/matchers.js | 7 +++ 4 files changed, 70 insertions(+) diff --git a/packages/jest-matchers/src/__tests__/__snapshots__/matchers-test.js.snap b/packages/jest-matchers/src/__tests__/__snapshots__/matchers-test.js.snap index 75bbdc7baa0d..367d2cc60dc2 100644 --- a/packages/jest-matchers/src/__tests__/__snapshots__/matchers-test.js.snap +++ b/packages/jest-matchers/src/__tests__/__snapshots__/matchers-test.js.snap @@ -2605,6 +2605,23 @@ Difference:  ]" `; +exports[`toMatchObject() {pass: false} expect({"a": "a", "c": "d"}).toMatchObject({"a": Any}) 1`] = ` +"expect(received).toMatchObject(expected) + +Expected value to match object: + {\\"a\\": Any} +Received: + {\\"a\\": \\"a\\", \\"c\\": \\"d\\"} +Difference: +- Expected ++ Received + + Object { +- \\"a\\": Any, ++ \\"a\\": \\"a\\", + }" +`; + exports[`toMatchObject() {pass: false} expect({"a": "b", "c": "d"}).toMatchObject({"a": "b!", "c": "d"}) 1`] = ` "expect(received).toMatchObject(expected) @@ -2790,6 +2807,29 @@ Difference:  }" `; +exports[`toMatchObject() {pass: false} expect({"a": [3, 4, 5], "b": "b"}).toMatchObject({"a": {"b": Any}}) 1`] = ` +"expect(received).toMatchObject(expected) + +Expected value to match object: + {\\"a\\": {\\"b\\": Any}} +Received: + {\\"a\\": [3, 4, 5], \\"b\\": \\"b\\"} +Difference: +- Expected ++ Received + + Object { +- \\"a\\": Object { +- \\"b\\": Any, +- }, ++ \\"a\\": Array [ ++ 3, ++ 4, ++ 5, ++ ], + }" +`; + exports[`toMatchObject() {pass: false} expect({"a": 1, "b": 1, "c": 1, "d": {"e": {"f": 555}}}).toMatchObject({"d": {"e": {"f": 222}}}) 1`] = ` "expect(received).toMatchObject(expected) @@ -2983,6 +3023,24 @@ Received: {\\"a\\": [3, 4, 5], \\"b\\": \\"b\\"}" `; +exports[`toMatchObject() {pass: true} expect({"a": {"x": "x", "y": "y"}}).toMatchObject({"a": {"x": Any}}) 1`] = ` +"expect(received).not.toMatchObject(expected) + +Expected value not to match object: + {\\"a\\": {\\"x\\": Any}} +Received: + {\\"a\\": {\\"x\\": \\"x\\", \\"y\\": \\"y\\"}}" +`; + +exports[`toMatchObject() {pass: true} expect({"a": 1, "c": 2}).toMatchObject({"a": Any}) 1`] = ` +"expect(received).not.toMatchObject(expected) + +Expected value not to match object: + {\\"a\\": Any} +Received: + {\\"a\\": 1, \\"c\\": 2}" +`; + exports[`toMatchObject() {pass: true} expect({"a": 2015-11-30T00:00:00.000Z, "b": "b"}).toMatchObject({"a": 2015-11-30T00:00:00.000Z}) 1`] = ` "expect(received).not.toMatchObject(expected) diff --git a/packages/jest-matchers/src/__tests__/matchers-test.js b/packages/jest-matchers/src/__tests__/matchers-test.js index fb818495f7ec..2e2279739014 100644 --- a/packages/jest-matchers/src/__tests__/matchers-test.js +++ b/packages/jest-matchers/src/__tests__/matchers-test.js @@ -679,6 +679,8 @@ describe('toMatchObject()', () => { [{a: 'b', t: {x: {r: 'r'}, z: 'z'}}, {t: {x: {r: 'r'}}}], [{a: [3, 4, 5], b: 'b'}, {a: [3, 4, 5]}], [{a: [3, 4, 5, 'v'], b: 'b'}, {a: [3, 4, 5, 'v']}], + [{a: 1, c: 2}, {a: jestExpect.any(Number)}], + [{a: {x: 'x', y: 'y'}}, {a: {x: jestExpect.any(String)}}], [new Date('2015-11-30'), new Date('2015-11-30')], [{a: new Date('2015-11-30'), b: 'b'}, {a: new Date('2015-11-30')}], [{a: null, b: 'b'}, {a: null}], @@ -698,12 +700,14 @@ describe('toMatchObject()', () => { [ [{a: 'b', c: 'd'}, {e: 'b'}], [{a: 'b', c: 'd'}, {a: 'b!', c: 'd'}], + [{a: 'a', c: 'd'}, {a: jestExpect.any(Number)}], [{a: 'b', t: {x: {r: 'r'}, z: 'z'}}, {a: 'b', t: {z: [3]}}], [{a: 'b', t: {x: {r: 'r'}, z: 'z'}}, {t: {l: {r: 'r'}}}], [{a: [3, 4, 5], b: 'b'}, {a: [3, 4, 5, 6]}], [{a: [3, 4, 5], b: 'b'}, {a: [3, 4]}], [{a: [3, 4, 'v'], b: 'b'}, {a: ['v']}], [{a: [3, 4, 5], b: 'b'}, {a: {b: 4}}], + [{a: [3, 4, 5], b: 'b'}, {a: {b: jestExpect.any(String)}}], [[1, 2], [1, 3]], [new Date('2015-11-30'), new Date('2015-10-10')], [{a: new Date('2015-11-30'), b: 'b'}, {a: new Date('2015-10-10')}], diff --git a/packages/jest-matchers/src/jasmine-utils.js b/packages/jest-matchers/src/jasmine-utils.js index 1273fda9c2af..b77d3c818c7c 100644 --- a/packages/jest-matchers/src/jasmine-utils.js +++ b/packages/jest-matchers/src/jasmine-utils.js @@ -297,4 +297,5 @@ module.exports = { hasProperty, isA, isUndefined, + asymmetricMatch, }; diff --git a/packages/jest-matchers/src/matchers.js b/packages/jest-matchers/src/matchers.js index 253d96dd1fb2..f8e418837514 100644 --- a/packages/jest-matchers/src/matchers.js +++ b/packages/jest-matchers/src/matchers.js @@ -31,6 +31,8 @@ const { } = require('jest-matcher-utils'); const { equals, + asymmetricMatch, + isUndefined, } = require('./jasmine-utils'); type ContainIterable = ( @@ -561,6 +563,11 @@ const matchers: MatchersObject = { const compare = (expected: any, received: any): boolean => { + const asymmetricResult = asymmetricMatch(expected, received); + if (!isUndefined(asymmetricResult)) { + return asymmetricResult; + } + if (typeof received !== typeof expected) { return false; }