Jest: how to test for object keys and values?
JavascriptUnit TestingJestjsJavascript Problem Overview
I have a mapModule
where I import components and export them:
import ComponentName from '../components/ComponentName';
export default {
name: ComponentName,
};
How can I test that mapModule
has the correct exported keys, values and that they are not null or undefined?
Javascript Solutions
Solution 1 - Javascript
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
Solution 2 - Javascript
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
Solution 3 - Javascript
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
Solution 4 - Javascript
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.
Solution 5 - Javascript
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);
Solution 6 - Javascript
Another way is to:
expect(JSON.stringify(object)).toBe(JSON.stringify(object))
This will ensure the objects are the same.
However using this:
expect(object).toMatchObject(object)
is the best option in most cases.