70
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Jestで非同期関数が例外を投げることをテストする。

Last updated at Posted at 2018-08-08

背景

バイトで、Async関数が例外を投げてくれること、そしてその例外がどの例外であるかをテストする必要が出てきました。そのときのメモを残しておこうと思います。

やってみよう

expectに関数を渡して、toThrowしてやると非同期でない関数が例外を投げるかどうかをテストできます。しかし、この場合、expectにAsync関数を渡しても期待どおりのテストを行うことはできません。

test('throws on octopus', () => {
  expect(() => {
    drinkFlavor('octopus');
  }).toThrow();
});

非同期処理が失敗したときに追加でアサーションを行うためには、rejectsを使います。この場合、Promiseが成功したときはアサーションが失敗します。

次のようなdrinkFlavorがあったとします。

async function drinkFlavor(flavor) {
  if (flavor == 'octopus') {
    throw new DisgustingFlavorError('yuck, octopus flavor');
  }
  // Do some other stuff
}

この関数に引数'octopus'を渡したときにDisgustingFlavorErrorをThrowすることをテストします。

test('rejects to octopus', async () => {
  const drinkFlavorPromise = drinkFlavor('octopus')
  await expect(drinkFlavorPromise).rejects.toThrow();
});

そして、toThrowに引数を与えることによって、そのThrowされた例外が'octopus'を含んで投げられたかどうかをテストします。この引数には正規表現を与えることも可能です。

test('rejects to octopus', async () => {
  const drinkFlavorPromise = drinkFlavor('octopus')
  await expect(drinkFlavorPromise).rejects.toThrow('octopus');
});

そして、toThrowErrorを使うことで、その投げられたErrorがDisgustingFlavorErrorであるかどうかをテストできます。

test('rejects to octopus', async () => {
  const drinkFlavorPromise = drinkFlavor('octopus')
  await expect(drinkFlavorPromise).rejects.toThrowError(DisgustingFlavorError);
});

感想

そこそこよくあるパターンではあると思うのですが、今まで出くわさなかったので、これを機に知れて嬉しいですね。

70
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
70
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?