created: 2023-09-14T08:26:00.139Z

jest の test.each でタイムアウトする

たとえば jest でこういう table テストを書くとタイムアウトしてしまう。

test.each([
  [100000, "100,000"],
  [10000000, "10,000,000"],
])("", (i, expected, options = {}) => {
  const actual = maskMoney(i, options);
  expect(actual).toBe(expected);
});

thrown: "Exceeded timeout of 5000 ms for a test while waiting for done() to be called. Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

原因

なるほど。

Taking an argument outside of jest.each means it is a done callback: https://jestjs.io/docs/next/api#testname-fn-timeout, and Jest will wait for it to be invoked

jest は test 関数の最後の引数を done 関数として扱い、これが呼ばれるまで待つような挙動になる。

今回の実装ではテーブル部分に [100000, "100,000"] と引数を 2 つしか渡していなかったのに、テスト関数の引数を (i, expected, options = {}) => { のようにして 3 つ定義していた。最後の 1 つにはデフォルト値を設定していたのだが、デフォルト値ではなくこれが done 関数として扱われていた。

単体テストの考え方/使い方
[ad] 単体テストの考え方/使い方
Vladimir Khorikov, 須田智之 (単行本(ソフトカバー))