Skip to content

Commit 9fa2a46

Browse files
authored
Include symbol keys when diffing objects (#13810)
1 parent 3d7a096 commit 9fa2a46

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
### Fixes
66

7+
- `[@jest/expect-utils]` `toMatchObject` diffs should include `Symbol` properties ([#13810](https://github.com/facebook/jest/pull/13810))
8+
79
### Chore & Maintenance
810

911
### Performance

packages/expect-utils/src/utils.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,17 @@ const hasPropertyInObject = (object: object, key: string | symbol): boolean => {
4343
);
4444
};
4545

46+
// Retrieves an object's keys for evaluation by getObjectSubset. This evaluates
47+
// the prototype chain for string keys but not for symbols. (Otherwise, it
48+
// could find values such as a Set or Map's Symbol.toStringTag, with unexpected
49+
// results.)
50+
//
51+
// Compare with subsetEquality's use of Reflect.ownKeys.
52+
const getObjectKeys = (object: object) => [
53+
...Object.keys(object),
54+
...Object.getOwnPropertySymbols(object),
55+
];
56+
4657
export const getPath = (
4758
object: Record<string, any>,
4859
propertyPath: string | Array<string>,
@@ -131,7 +142,7 @@ export const getObjectSubset = (
131142
const trimmed: any = {};
132143
seenReferences.set(object, trimmed);
133144

134-
Object.keys(object)
145+
getObjectKeys(object)
135146
.filter(key => hasPropertyInObject(subset, key))
136147
.forEach(key => {
137148
trimmed[key] = seenReferences.has(object[key])
@@ -144,7 +155,7 @@ export const getObjectSubset = (
144155
);
145156
});
146157

147-
if (Object.keys(trimmed).length > 0) {
158+
if (getObjectKeys(trimmed).length > 0) {
148159
return trimmed;
149160
}
150161
}

packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4140,13 +4140,13 @@ exports[`toMatchObject() {pass: false} expect({"a": "a", "c": "d"}).toMatchObjec
41404140
exports[`toMatchObject() {pass: false} expect({"a": "b", "c": "d", Symbol(jest): "jest"}).toMatchObject({"a": "c", Symbol(jest): Any<String>}) 1`] = `
41414141
<d>expect(</><r>received</><d>).</>toMatchObject<d>(</><g>expected</><d>)</>
41424142

4143-
<g>- Expected - 2</>
4143+
<g>- Expected - 1</>
41444144
<r>+ Received + 1</>
41454145

41464146
<d> Object {</>
41474147
<g>- "a": "c",</>
4148-
<g>- Symbol(jest): Any<String>,</>
41494148
<r>+ "a": "b",</>
4149+
<d> Symbol(jest): Any<String>,</>
41504150
<d> }</>
41514151
`;
41524152

0 commit comments

Comments
 (0)