web-dev-qa-db-ja.com

Jestでスローされた例外のタイプをテストする方法

私は、関数によってスローされた例外のタイプをテストする必要があるコードで作業しています(TypeError、ReferenceErrorなど)。

私の現在のテストフレームワークはAVAであり、2番目の引数t.throwsメソッドとして次のようにテストできます。

it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
  const error = t.throws(() => {
    throwError();
  }, TypeError);

  t.is(error.message, 'UNKNOWN ERROR');
});

テストをJestに書き直し始めましたが、簡単にそれを行う方法が見つかりませんでした。それも可能ですか?

63
Tranotheron

Jestでは、関数をexpect(function).toThrow(blankまたはtype of error)に渡す必要があります。

例:

test("Test description", () => {
  const t = () => {
    throw new TypeError();
  };
  expect(t).toThrow(TypeError);
});

既存の関数を引数のセットでスローするかどうかをテストする必要がある場合、expect()で匿名関数内にラップする必要があります。

例:

test("Test description", () => {
  expect(() => {http.get(yourUrl, yourCallbackFn)}).toThrow(TypeError);
});
97
PeterDanis

少し奇妙ですが、動作し、私見は読みやすいです:

it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', () => {
  try {
      throwError();
      // Fail test if above expression doesn't throw anything.
      expect(true).toBe(false);
  } catch (e) {
      expect(e.message).toBe("UNKNOWN ERROR");
  }
});

Catchブロックは例外をキャッチし、発生したErrorでテストできます。予想されるErrorがスローされない場合、テストに失敗するには奇妙なexpect(true).toBe(false);が必要です。それ以外の場合、この行には到達できません(Errorはそれらの前に上げる必要があります)。

34
bodolsog

私はもう少し簡潔なバージョンを使用します:

expect(() => {
  //code block that should throw error
}).toThrow(TypeError) //or .toThrow('expectedErrorMessage')
10
Tal Joffe

自分で試したことはありませんが、Jestの toThrow アサーションを使用することをお勧めします。したがって、あなたの例は次のようになります。

it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
  const error = t.throws(() => {
    throwError();
  }, TypeError);

  expect(t).toThrowError('UNKNOWN ERROR');
  //or
  expect(t).toThrowError(TypeError);
});

繰り返しますが、テストはしていませんが、うまくいくと思います。

これが役立ったら教えてください。

ハッピーコーディング!

9
Andrei CACIO

Jestには、関数が呼び出されたときにスローされることをテストするメソッドtoThrow(error)があります。

だから、あなたの場合、あなたはそれをそう呼ぶべきです:

expect(t).toThrowError(TypeError);

ドキュメント

8
alexmac

試してみる
expect(t).rejects.toThrow()

1
Razim Saidov

Test-utilsライブラリの便利なメソッドを書くことになりました

/**
 *  Utility method to test for a specific error class and message in Jest
 * @param {fn, expectedErrorClass, expectedErrorMessage }
 * @example   failTest({
      fn: () => {
        return new MyObject({
          param: 'stuff'
        })
      },
      expectedErrorClass: MyError,
      expectedErrorMessage: 'stuff not yet implemented'
    })
 */
  failTest: ({ fn, expectedErrorClass, expectedErrorMessage }) => {
    try {
      fn()
      expect(true).toBeFalsy()
    } catch (err) {
      let isExpectedErr = err instanceof expectedErrorClass
      expect(isExpectedErr).toBeTruthy()
      expect(err.message).toBe(expectedErrorMessage)
    }
  }
1
kpollock