How to make Jest wait for all asynchronous code to finish execution before expecting an assertion How to make Jest wait for all asynchronous code to finish execution before expecting an assertion reactjs reactjs

How to make Jest wait for all asynchronous code to finish execution before expecting an assertion


Here's a snippet that waits until pending Promises are resolved:

const flushPromises = () => new Promise(setImmediate);

Note that setImmediate is a non-standard feature (and is not expected to become standard). But if it's sufficient for your test environment, should be a good solution. Its description:

This method is used to break up long running operations and run a callback function immediately after the browser has completed other operations such as events and display updates.

Here's roughly how to use it using async/await:

it('is an example using flushPromises', async () => {    const wrapper = mount(<App/>);    await flushPromises();    wrapper.update(); // In my experience, Enzyme didn't always facilitate component updates based on state changes resulting from Promises -- hence this forced re-render    // make assertions });

I used this a lot in this project if you want some working real-world examples.


I would suggest you export aThingThatReturnsAPromise() from its module or file and then import it into your test case.

Since aThingThatReturnsAPromise() returns a promise, you can make use of the asynchronous testing features of Jest. Jest will wait for your promise to resolve and then you can make your assertions.

describe('When rendering Parent', () => {    var parent;    beforeAll(() => {        parent = mount(<Parent />)    });    it('should display Child with response of the service', () => {        expect.assertions(1);        return aThingThatReturnsAPromise().then( () => {            expect(parent.html()).toMatch('fakeReturnValue');        });    });});

For more info, read how Jest handles test cases with Promises in the Jest Docs here


I'm unaware of anything native to React to accomplish what you're looking for.

However, I was able to accomplish this in similar code by calling beforeAll()'s @done after setup was complete. See changes to your code below:

let setupComplete;jest.mock('eternalService', () => {    return jest.fn(() => {        return { doSomething: jest.fn((cb) => { cb('fakeReturnValue'); setupComplete(); }) };});...    beforeAll(done => {        parent = mount(<Parent />)        setupComplete = done;    });});