[javascript] jest.setTimeout에 의해 지정된 5000ms 시간 초과 내에 비동기 콜백이 호출되지 않았습니다.

puppeteer와 jest를 사용하여 프런트 엔드 테스트를 실행하고 있습니다.

내 테스트는 다음과 같습니다.

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);
});

때로는 테스트를 실행할 때 모든 것이 예상대로 작동합니다. 다른 경우에는 오류가 발생합니다.

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:633:19)

다음과 같은 이유로 이상합니다.

  1. 시간 초과를 30000으로 지정했습니다.

  2. 이 오류가 발생하는지 여부는 매우 무작위로 보입니다.

왜 이런 일이 일어나는지 추측 할 수 있습니까?



답변

따라서 여기서 지정하는 시간 초과는 기본 시간 초과보다 짧아야합니다.

기본 시간 초과는 5000이고 기본적으로 프레임 워크는 jasmine입니다 jest. 테스트 내부에 시간 초과를 추가하여 추가 할 수 있습니다

jest.setTimeout(30000);

그러나 이것은 테스트에만 해당됩니다. 또는 프레임 워크에 대한 구성 파일을 설정할 수 있습니다.

https://facebook.github.io/jest/docs/en/configuration.html#setuptestframeworkscriptfile-string

// 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)

이 스레드도 참조

https://github.com/facebook/jest/issues/5055

https://github.com/facebook/jest/issues/652

PS 철자 오류 setupFilesAfterEnv(예 🙂 setupFileAfterEnv도 같은 오류가 발생합니다.


답변

async/await테스트에서 비동기 일 때 호출해야합니다 .

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);
});


답변

Jest가 발전함에 따라이 질문에 대한 답변이 변경되었습니다. 현재 답변 (2019 년 3 월) :

  1. 에 세 번째 매개 변수를 추가하여 개별 테스트의 시간 초과를 무시할 수 있습니다 it. 즉.it('runs slow', () => {...}, 9999)

  2. 을 사용하여 기본값을 변경할 수 있습니다 jest.setTimeout. 이것을하기 위해:

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

// File: src/jest/defaultTimeout.js
/* global jest */
jest.setTimeout(1000)
  1. 다른 사람들이 지적했듯이 이것과 직접 관련 done이없는 것은 async / await 접근법에는 필요하지 않습니다.

답변

3000테스트 시간이 초과 되어도 여전히 (임의로) 실패하는 경우가 있습니다.

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

@Tarun의 훌륭한 답변 덕분에 많은 테스트를 해결하는 가장 짧은 방법은 다음과 같습니다.

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

  test('best jest test fest', async () => {
    // blah
  });
});


답변

이것은 비교적 새로운 업데이트이지만 훨씬 간단합니다. jest 24.9.0 이상을 사용하는 경우 testTimeout구성에 추가 할 수 있습니다 .

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


답변

done();콜백 을 호출 해야합니다. 그렇지 않으면 단순히 테스트를 통과하지 않습니다.

beforeAll((done /* call it or remove it*/) => {
  done(); // calling it
});

done () 콜백이있는 다른 모든 함수에 적용됩니다.


답변

jest 24.9+의 경우 다음을 추가하여 명령 줄에서 시간 초과를 설정할 수도 있습니다 --testTimeout

다음은 문서 에서 발췌 한 것입니다.

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