Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jest: how to test for object keys and values?

People also ask

How do you check if all object keys has value?

To check if all values in object are equal to true :Use the Object. values() method to get an array of the object's values. Call the every() method on the array. The every method will test if all values in the array are equal to true and will return the result.

How do you find the key of an object?

Use object. keys(objectName) method to get access to all the keys of object.


In version 23.3.0 of jest,

expect(string).toMatch(string) 

expects a string.

Use:

const expected = { name:'component name' }
const actual = { name: 'component name', type: 'form' }
expect(actual).toMatchObject(expected)

result is passing test


you can use one of those:

toEqual and toMatchObject are template matchers for objects:

let Obj = {name: 'component name', id: 2};
expect(oneObj).toEqual({name: 'component name'}) // false, should be exactly equal all Obj keys and values  
expect(oneObj).toMatchObject({name: 'component name'}) // true

or easly use toHaveProperty :

let Obj = {name: 'component name'};
expect(oneObj).toHaveProperty('name') // true
expect(oneObj).toHaveProperty('name', 'component name') // true

Keep in mind that .toMatchObject checks

"that a JavaScript object matches a subset of the properties of an object."

So toMatchObject can have unintended assertions such as:

expect({ a: 1, b: 2 }).toMatchObject({ a: 1 }); // pass

If you do want to match an object exactly, you should use .toStrictEqual, available since jest 23:

expect({ a: 1, b: 2 }).toStrictEqual({ a: 1 }); // fail

For a single key you can check out

expect(Boolean(obj[prop])).toBe(true | false);

For multiple key (where all must be present) you can use,

expect(Boolean(obj[prop1]) && Boolean(obj[prop2])).toBe(true | false);

For multiple key (where any one must be present) you can use

expect(Boolean(obj[prop1]) || Boolean(obj[prop2])).toBe(true | false);


Just adding this tip, thought it gave even better granularity to my own tests, especially when matching against arguments to mocked services:

expect.objectContaining({
   url: expect.stringContaining('https://'),
})

Alternatively, you can use regex with expect.stringMatching which tests the given regex against the value. Pretty neat.

expect.stringContaining expect.stringMatching