Making Assertions on Properties That Are Null or Undefined
Use jest-extended matchers to make more accurate test assertions.
The case is unique in that we don’t know what the email field might resolve as. And we want to tell the assertion as such.
Say we have a User type:
type User = { id: string; name: string; email: string | undefined;};
Say we have a STOOPID function that retrieves a User, amongst other things:
describe('get user', () => { it('returns a user', () => { const user = getUser();
expect(user).toEqual( expect.objectContaining({ id: expect.any(String), name: expect.any(String), email: <--- JEST, THIS CAN BE EITHER A STRING OR UNDEFINED? }) ); });});
Jest exposes matchers that allows us to make validations. In making assertions on the shape of a response we can use asymmetric matchers like expect.any
. They are only able to be used within a toEqual
or toHaveBeenCalledWith
. They are also limited in what they can assert. For instance, Jest does not expose an asymmetric matcher that can be used to assert a field as being null or undefined. So, how do extend Jest to allow for this?
We can use jest-extended
, a community maintained library of Jest matchers. jest-extended
exports a matcher expect.toBeOneOf
:
describe("get user", () => { it("returns a user", () => { const user = getUser();
expect(user).toEqual( expect.objectContaining({ id: expect.any(String), name: expect.any(String), email: expect.toBeOneOf([expect.any(String), null, undefined]), }), ); });});
I discovered this utility in Chris Cooks blog post Use expect.objectContaining With Null and Undefined. The installation process is outlined here.