DEV Community

Chris Cook
Chris Cook

Posted on • Originally published at zirkelc.dev

7 2 2 2 2

How To Use expect.objectContaining With Null and Undefined

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);
});



Enter fullscreen mode Exit fullscreen mode

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.

CodeSandBox

I've prepared a CodeSandBox that lets you try it out quickly without having to go to the trouble of setting up Jest:

Try CodeSandBox


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!

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read more

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more