Message "Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout"

JavascriptAutomated TestsJestjsPuppeteer

Javascript Problem Overview


I'm using Puppeteer and Jest to run some front end tests.

My tests look as follows:

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, async () => {
      await page.waitForSelector(PROFILE.TAB);
      await page.click(PROFILE.TAB);
    }, 30000);
});

Sometimes, when I run the tests, everything works as expectedly. Other times, I get an error:

> Timeout - Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout. > > at node_modules/jest-jasmine2/build/queue_runner.js:68:21
> at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:633:19)

This is strange because:

  1. I specified the timeout to be 30000

  2. Whether or not I get this error is seemingly very random

Why is this happening?

Javascript Solutions


Solution 1 - Javascript

The timeout you specify here needs to be shorter than the default timeout.

The default timeout is 5000 and the framework by default is jasmine in case of jest. You can specify the timeout inside the test by adding

jest.setTimeout(30000);

But this would be specific to the test. Or you can set up the configuration file for the framework.

Configuring Jest

// jest.config.js
module.exports = {
  // setupTestFrameworkScriptFile has been deprecated in
  // favor of setupFilesAfterEnv in jest 24
  setupFilesAfterEnv: ['./jest.setup.js']
}

// jest.setup.js
jest.setTimeout(30000)

See also these threads:

setTimeout per test #5055

Make jasmine.DEFAULT_TIMEOUT_INTERVAL configurable #652

P.S.: The misspelling setupFilesAfterEnv (i.e. setupFileAfterEnv) will also throw the same error.

Solution 2 - Javascript

It should call the async/await when it is async from test.

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, async (done) => {
        await page.waitForSelector(PROFILE.TAB);
        await page.click(PROFILE.TAB);
        done();
    }, 30000);
});

Solution 3 - Javascript

The answer to this question has changed as Jest has evolved. Current answer (March 2019):

  1. You can override the timeout of any individual test by adding a third parameter to the it. I.e., it('runs slow', () => {...}, 9999)

  2. You can change the default using jest.setTimeout. To do this:

    // Configuration
    "setupFilesAfterEnv": [  // NOT setupFiles
        "./src/jest/defaultTimeout.js"
    ],
    

    and

    // File: src/jest/defaultTimeout.js
    /* Global jest */
    jest.setTimeout(1000)
    
  3. Like others have noted, and not directly related to this, done is not necessary with the async/await approach.

Solution 4 - Javascript

This is a relatively new update, but it is much more straight forward. If you are using Jest 24.9.0 or higher you can just add testTimeout to your config:

// in jest.config.js
module.exports = {
  testTimeout: 30000
}

Solution 5 - Javascript

I would like to add (this is a bit long for a comment) that even with a timeout of 3000 my tests would still sometimes (randomly) fail with

> Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

Thanks to Tarun's great answer, I think the shortest way to fix a lot of tests is:

describe('Puppeteer tests', () => {
  beforeEach(() => {
    jest.setTimeout(10000);
  });

  test('Best Jest test fest', async () => {
    // Blah
  });
});

Solution 6 - Javascript

For Jest 24.9+, we just need to add --testTimeout on the command line:

--testTimeout= 10000 // Timeout of 10 seconds

The default timeout value is 5000 (5000 ms - 5 seconds). This will be applicable for all test cases.

Or if you want to give timeout to particular function only then you can use this syntax while declaring the test case.

test(name, fn, timeout)
Example
test('example', async () => {

}, 10000); // Timeout of 10 seconds (default is 5000 ms)

Solution 7 - Javascript

For Jest 24.9+, you can also set the timeout from the command line by adding --testTimeout.

Here's an excerpt from its documentation:

> --testTimeout=<number>
> Default timeout of a test in milliseconds. Default value: 5000.

Solution 8 - Javascript

Make sure to invoke done(); on callbacks or it simply won't pass the test.

beforeAll((done /* Call it or remove it */ ) => {
  done(); // Calling it
});

It applies to all other functions that have a done() callback.

Solution 9 - Javascript

Yet another solution: set the timeout in the Jest configuration file, e.g.:

{ // ... other stuff here
    "testTimeout": 90000
}

Solution 10 - Javascript

You can also get timeout errors based on silly typos. For example, this seemingly innocuous mistake:

describe('Something', () => {
  it('Should do something', () => {
    expect(1).toEqual(1)
  })

  it('Should do nothing', something_that_does_not_exist => {
    expect(1).toEqual(1)
  })
})

Produces the following error:

FAIL src/TestNothing.spec.js (5.427s)
  ● Something › Should do nothing

    Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
      
      at node_modules/jest-jasmine2/build/queue_runner.js:68:21
      at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:678:19)

While the code sample posted doesn't suffer from this, it might be a cause of failures elsewhere. Also note that I'm not setting a timeout for anything anywhere - either here or in the configuration. The 5000 ms is just the default setting.

Solution 11 - Javascript

I recently ran into this issue for a different reason: I was running some tests synchronously using jest -i, and it would just timeout. For whatever reasoning, running the same tests using jest --runInBand (even though -i is meant to be an alias) doesn't time out.

Solution 12 - Javascript

The timeout problem occurs when either the network is slow or many network calls are made using await. These scenarios exceed the default timeout, i.e., 5000 ms. To avoid the timeout error, simply increase the timeout of globals that support a timeout. A list of globals and their signature can be found here.

For Jest 24.9

Solution 13 - Javascript

// In jest.setup.js
jest.setTimeout(30000)

If on Jest <= 23:

// In jest.config.js
module.exports = {
  setupTestFrameworkScriptFile: './jest.setup.js'
}

If on Jest > 23:

// In jest.config.js
module.exports = {
  setupFilesAfterEnv: ['./jest.setup.js']
}

Solution 14 - Javascript

In case someone doesn't fix the problem use methods above. I fixed mine by surrounding the async func by an arrow function. As in:

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, (() => {
      async () => {
        await page.waitForSelector(PROFILE.TAB)
        await page.click(PROFILE.TAB)
      }
    })(), 30000);
});

Solution 15 - Javascript

Turns out if your expect assertions are wrong, it can sometimes spit out the exceeded timeout error message.

I was able to figure this out by putting console.log() statements in my promise callback and saw the console.log() statements were getting ran in the jest output. Once I fixed my expect assertions, the timeout error went away and tests worked.

I spent way too long to figure this out and hope this helps whoever needs to read this.

Solution 16 - Javascript

Mar 14, 2022, Jest 27.5 documentation indicates a new process:

https://jestjs.io/docs/api#beforeallfn-timeout

Pass a second parameter to test with the number of msec before timeout. Works!

test('adds 1 + 2 to equal 3', () => {
    expect(3).toBe(3);
},30000);

Solution 17 - Javascript

test accepts a timeout argument. See https://jestjs.io/docs/api#testname-fn-timeout. Here is a sample:

async function wait(millis) {
  console.log(`sleeping for ${millis} milliseconds`);
  await new Promise(r => setTimeout(r, millis));
  console.log("woke up");
}
test('function', async () => {
  await wait(5000);
}, 70000);

Solution 18 - Javascript

For those who are looking for an explanation about jest --runInBand, you can go to the documentation.

Running Puppeteer in CI environments

GitHub - smooth-code/jest-puppeteer: Run your tests using Jest & Puppeteer

Solution 19 - Javascript

In my case, this error started appearing randomly and wouldn't go away even after setting a timeout of 30000. Simply ending the process in the terminal and rerunning the tests resolved the issue for me. I have also removed the timeout and tests are still passing again.

Solution 20 - Javascript

Dropping my 2 cents here, I had the same issue on dosen of jest unit test (not all of them) and I notice that all started after I added to jestSetup this polyfill for MutuationObservers:

if (!global.MutationObserver) {
    global.MutationObserver = function MutationObserverFun(callback) {
        this.observe = function(){};
        this.disconnect = function(){};
        this.trigger = (mockedMutationsList) => {
            callback(mockedMutationsList, this);
        };
    };
}

Once I removed it test start working again correctly. Hope helps someone .

Solution 21 - Javascript

This probably won't be terribly helpful to most people visiting this page, but when I was getting this error it had nothing to do with Jest. One of my method calls was getting an empty object and a null exception while running locally. Once I added a null check, the failing tests and console log in question disappeared.

if(response !== null){
    this.searchSubj.next(resp);
 }
 else {
    return;
 }

Solution 22 - Javascript

Unfortunately, jest does not work with async/await. That's why we pass done callback. Instead of using async/await in try/catch, use then/catch.

If you want your test successfully runs, you call it inside then, if you want your test to fail you call done inside catch. If done function does not get called in 5000ms jest will throw error.

If you use done with async/await you will get this error.

"Test functions cannot both take a 'done' callback and return something.
 Either use a 'done' callback, or return a promise."

Here is the solution:

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, (done) => {
      // If you want this functionality passes, use inside then()
      page.waitForSelector(PROFILE.TAB).then(()=>done())
      // If you want this functionality fails, use inside catch()
      page.click(PROFILE.TAB).catch(()=>done())
    });
});

Solution 23 - Javascript

add this in your test, not much to explain

beforeEach(() => {
  jest.useFakeTimers()
  jest.setTimeout(100000)
})

afterEach(() => {
  jest.clearAllTimers()
})

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAsoolView Question on Stackoverflow
Solution 1 - JavascriptTarun LalwaniView Answer on Stackoverflow
Solution 2 - Javascriptschrodinger's codeView Answer on Stackoverflow
Solution 3 - JavascriptndpView Answer on Stackoverflow
Solution 4 - Javascripte-shfiyutView Answer on Stackoverflow
Solution 5 - JavascriptRomanView Answer on Stackoverflow
Solution 6 - JavascriptSharoon CkView Answer on Stackoverflow
Solution 7 - JavascriptMr. 14View Answer on Stackoverflow
Solution 8 - JavascriptZenVentziView Answer on Stackoverflow
Solution 9 - Javascriptserv-incView Answer on Stackoverflow
Solution 10 - JavascriptRichard WheeldonView Answer on Stackoverflow
Solution 11 - JavascriptJonaView Answer on Stackoverflow
Solution 12 - JavascriptNeeraj SewaniView Answer on Stackoverflow
Solution 13 - JavascriptalexrogersView Answer on Stackoverflow
Solution 14 - Javascriptsuga_eView Answer on Stackoverflow
Solution 15 - JavascriptXchaiView Answer on Stackoverflow
Solution 16 - Javascriptuser2330237View Answer on Stackoverflow
Solution 17 - JavascriptJingguo YaoView Answer on Stackoverflow
Solution 18 - JavascriptEduardo HernándezView Answer on Stackoverflow
Solution 19 - JavascriptSaurabh MisraView Answer on Stackoverflow
Solution 20 - JavascriptalbanxView Answer on Stackoverflow
Solution 21 - JavascriptSauerTroutView Answer on Stackoverflow
Solution 22 - JavascriptYilmazView Answer on Stackoverflow
Solution 23 - JavascriptAN GermanView Answer on Stackoverflow