Table of Contents
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
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');
});