From d59017dc885ef91925118439d434286a1b75094f Mon Sep 17 00:00:00 2001 From: Will Brock Date: Sun, 27 May 2018 15:56:59 -0400 Subject: [PATCH] fix: toMatchObject throws TypeError when a source property is null (#6313) --- CHANGELOG.md | 4 +++ packages/expect/src/__tests__/utils.test.js | 30 ++++++++++++++++++++- packages/expect/src/utils.js | 1 + 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index def329b1e7d7..1c8a64f57487 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ ## master +### Fixes + +* `[expect]` toMatchObject throws TypeError when a source property is null ([#6313](https://github.com/facebook/jest/pull/6313)) + ## 23.0.1 ### Chore & Maintenance diff --git a/packages/expect/src/__tests__/utils.test.js b/packages/expect/src/__tests__/utils.test.js index 95f5d796a1cc..6a5e7d909680 100644 --- a/packages/expect/src/__tests__/utils.test.js +++ b/packages/expect/src/__tests__/utils.test.js @@ -9,7 +9,12 @@ 'use strict'; const {stringify} = require('jest-matcher-utils'); -const {emptyObject, getObjectSubset, getPath} = require('../utils'); +const { + emptyObject, + getObjectSubset, + getPath, + subsetEquality, +} = require('../utils'); describe('getPath()', () => { test('property exists', () => { @@ -122,3 +127,26 @@ describe('emptyObject()', () => { expect(emptyObject(34)).toBe(false); }); }); + +describe('subsetEquality()', () => { + test('matching object returns true', () => { + expect(subsetEquality({foo: 'bar'}, {foo: 'bar'})).toBe(true); + }); + + test('object without keys is undefined', () => { + expect(subsetEquality('foo', 'bar')).toBe(undefined); + }); + + test('objects to not match', () => { + expect(subsetEquality({foo: 'bar'}, {foo: 'baz'})).toBe(false); + expect(subsetEquality('foo', {foo: 'baz'})).toBe(false); + }); + + test('null does not return errors', () => { + expect(subsetEquality(null, {foo: 'bar'})).not.toBeTruthy(); + }); + + test('undefined does not return errors', () => { + expect(subsetEquality(undefined, {foo: 'bar'})).not.toBeTruthy(); + }); +}); diff --git a/packages/expect/src/utils.js b/packages/expect/src/utils.js index 93c060886a61..c25e9cc46c5d 100644 --- a/packages/expect/src/utils.js +++ b/packages/expect/src/utils.js @@ -206,6 +206,7 @@ export const subsetEquality = (object: Object, subset: Object) => { return Object.keys(subset).every( key => + object != null && hasOwnProperty(object, key) && equals(object[key], subset[key], [iterableEquality, subsetEquality]), );