If you use Jest for testing, you are probably familiar with the expect
function and its many matchers. One of the most useful matchers is expect.objectContaining()
, which allows you to check whether an object contains a certain set of properties and types.
However, one limitation of expect.objectContaining()
is that it does not support null
and undefined
values. This can be frustrating when testing code that returns properties that are optional or nullable.
I recently came across a workaround for this issue by using the expect.toBeOneOf()
matcher from the jest-extended library. This matcher allows you to check whether a value matches one of the expected values, including null
and undefined
.
test("should not allow null or undefined", async () => {
const userType = expect.objectContaining({
id: expect.any(Number),
name: expect.any(String),
email: expect.any(String),
});
//! email cannot be null or undefined
expect({
id: 1,
name: "John Doe",
email: undefined,
}).toEqual(userType);
});
test("should allow null or undefined", async () => {
const userType = expect.objectContaining({
id: expect.any(Number),
name: expect.any(String),
// allow null and undefined
email: expect.toBeOneOf([expect.any(String), null, undefined]),
});
//> email can be null
expect({
id: 1,
name: "John Doe",
email: null,
}).toEqual(userType);
//> email can be undefined
expect({
id: 2,
name: "Jane Doe",
email: undefined,
}).toEqual(userType);
});
In this example, we test whether the given object has a certain set of properties with particular types. For the email property, we use expect.toBeOneOf([expect.any(String), null, undefined])
to allow null
, undefined
or a string
as possible values.
Here is the result of the test run of the two test cases. As expected, the first test case fails because of the undefined
value of email. In the second test case, both null
and undefined
pass the test as valid values.
I've prepared a CodeSandBox that lets you try it out quickly without having to go to the trouble of setting up Jest:
I hope you found this post helpful. If you have any questions or comments, feel free to leave them below. If you'd like to connect with me, you can find me on LinkedIn or GitHub. Thanks for reading!
Top comments (0)