Not everything executes synchronously, so not everything should be tested synchronously. Jest offers a few options for asynchronous testing.
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.
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');
});
Join our DigitalOcean community of over a million developers for free! Get help and share knowledge in our Questions & Answers section, find tutorials and tools that will help you grow as a developer and scale your project or business, and subscribe to topics of interest.
Sign up