Asynchronous Tests in Jest

Matthew Garica

Not everything executes synchronously, so not everything should be tested synchronously. Jest offers a few options for asynchronous testing.

Using a Callback

If your function accepts a parameter, Jest will give it a done callback; the test will run until done or done.fail are called or it times out. This can be useful for testing observables:

// Let's say you're testing a cup that emits an event when it is full or spills.
it('fills without spilling.', (done) => {
  const smartCup = new SmartCup();
  // The event happened, so call `done`.
  smartCup.on('full', () => done());
  // If a failing condition happens, you can call `done.fail`.
  smartCup.on('spilled', () => done.fail());
  smartCup.fill();
});

Jest will wait for done if the function accepts a parameter. So something like:

it('works synchronously.', (done) => {
  expect(1).toBeGreaterThan(0);
});

…will run until it times out, since done is never called.

Returning a Promise

You can also make a test asynchronous by returning a promise:

it('returns a number.', () => {
  return getId()
    // After `getId` resolves, you can test it against your expectations.
    .then(id => expect(typeof id).toEqual('number'));
});

Since async functions return promises, you can use those, too:

// Same as above.
it('returns a number.', async () => {
  const id = await getId()
  expect(typeof id).toEqual('number');
});
✖ Clear

🕵 Search Results

🔎 Searching...