Tea_Lover_418
Tea_Lover_418

Reputation: 316

Excluding missing keys from JSON comparison

I have two JSON documents that I want to assert equal for Jest unit testing. They should be equal, except the second one has one more key: _id.

Example:

doc1.json
{
    username: 'someone',
    firstName: 'some',
    lastName: 'one',
}

doc2.json
{
    _id: '901735013857',
    username: 'someone',
    firstName: 'some',
    lastName: 'one',
}

My code currently looks like this:

const result = await activeDirectoryUserCollection
    .findOne({username: testUser1.username});
expect(result).toBe(testUser1);

Obviously this gives the error that they are not equal, just because of that one value.

I'm looking for an alternative to .toBe() that doesn't completely compare the docs, but checks if one is a subset of another. (or something like that).

Alternatively I would appreciate someone to point me to a module that could help me out.

Upvotes: 0

Views: 2872

Answers (3)

Mark
Mark

Reputation: 92481

I don't think you need to look outside jest for this. You can use expect.objectContaining(), which is described in the docs as:

expect.objectContaining(object) matches any received object that recursively matches the expected properties. That is, the expected object is a subset of the received object. Therefore, it matches a received object which contains properties that are present in the expected object.

You could use it like:

test('objects', () => {
    expect(doc2).toEqual(
        expect.objectContaining(doc1)
    );   
  });

Upvotes: 2

Akinjide
Akinjide

Reputation: 2763

You can iterate through one Object and use the key to assert value in both Objects. Read More for...in

const result = await activeDirectoryUserCollection
    .findOne({username: testUser1.username});

for (const prop in testUser1) {
   if (testUser1[prop]) {
     expect(result[prop]).toBe(testUser1[prop]); // or use .toEqual
   }
}

Upvotes: 2

c__money
c__money

Reputation: 76

I would checkout Lodash module's .isMatch function. It performs a partial deep comparison between object and source to determine if object contains equivalent property values. https://lodash.com/docs/4.17.11#isMatch

Example:

var object = { 'a': 1, 'b': 2 };

_.isMatch(object, { 'b': 2 });
// => true


_.isMatch(object, { 'b': 1 });
// => false

Upvotes: 3

Related Questions