Jest provides multiple methods for testing asynchronous code:
1. Using Callbacks:
javascripttest('async callback', (done) => { fetchData(callback => { expect(callback).toBe('data'); done(); }); });
2. Using Promises:
javascripttest('async promise', () => { return fetchData().then(data => { expect(data).toBe('data'); }); }); // Or using async/await test('async await', async () => { const data = await fetchData(); expect(data).toBe('data'); });
3. Using resolves and rejects:
javascripttest('promise resolves', () => { return expect(fetchData()).resolves.toBe('data'); }); test('promise rejects', () => { return expect(fetchData()).rejects.toThrow('error'); });
4. Testing Timers:
javascriptjest.useFakeTimers(); test('timer callback', () => { const callback = jest.fn(); setTimeout(callback, 1000); jest.runAllTimers(); expect(callback).toHaveBeenCalled(); });
Best Practices:
- Prefer async/await for clearer code
- Ensure returning Promise or calling done
- Use
resolvesandrejectsto simplify assertions - Use
jest.useFakeTimers()when testing timers - Set reasonable timeout (default is 5 seconds)