web-dev-qa-db-ja.com

Jest.setTimeoutで指定された5000ミリ秒のタイムアウト内に非同期コールバックが呼び出されませんでした

私はいくつかのフロントエンドテストを実行するために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. このエラーが出るかどうかは一見非常にランダムです

なぜこれが起こっているのか誰かが推測できますか?

75
Asool

そのため、ここで指定したタイムアウトはデフォルトのタイムアウトより短くする必要があります。

デフォルトのタイムアウトは5000で、フレームワークはデフォルトでjasmineの場合はjestです。追加することでテスト内のタイムアウトを指定できます。

jest.setTimeout(30000);

しかし、これはテストに固有のものです。あるいはフレームワークの設定ファイルを設定することもできます。

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

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

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

このスレッドも見てください

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

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

102
Tarun Lalwani

テストから非同期の場合はdone関数を呼び出す必要があります。

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

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

この質問に対する答えは、Jestが進化するにつれて変わりました。現在の回答(2019年3月):

  1. itに3番目のパラメータを追加することで、個々のテストのタイムアウトを無効にすることができます。すなわち。 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アプローチでは必要ありません。
8
ndp

コールバックで必ずdone();を呼び出すようにしてください。そうしないと、単にテストに合格しません。

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

Done()コールバックを持つ他のすべての関数に適用されます。

7
ZenVentzi

私は最近、別の理由でこの問題に遭遇しました。jest -iを使用していくつかのテストを同期的に実行していたのですが、タイムアウトするだけでした。どんな理由であれ、jest --runInBandを使用して同じテストを実行しても(-iは別名であることを意図していますが)タイムアウトにはなりません。

たぶんこれは誰かの助けになるでしょう¯\_(:/)_/¯

1
Jona

タイムアウトの問題は、ネットワークが遅い場合、またはawaitを使用して多くのネットワーク呼び出しが行われた場合に発生します。これらのシナリオはデフォルトのタイムアウト、つまり5000ミリ秒を超えます。タイムアウトエラーを回避するには、タイムアウトをサポートするグローバルのタイムアウトを増やすだけです。グローバルとその署名のリストは here にあります。
Jest 24.9の場合

0
neer17

jest --runInBandについての説明をお探しの方は、ドキュメント CI環境での人形劇の実行 https://github.com/smooth-code/jest-puppeteer にアクセスしてください。

0