URL: https://www.progressiverobot.com/testing-asynchronous-testing-jest/

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

Using a Callback

jest illustration for: 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');

});