非同期処理のテスト

date
Aug 10, 2023
repo_url
slug
async-test
status
Published
summary
type
Post
thumbnail_url
tags
jest
outer_link
非同期テストの書き方はいくつかある。
 

テスト対象の関数

引数に待ち時間を与えて、その値の分だけ待って、経過時間を返り値としてresolveする。
export function wait(duration: number) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(duration);
    }, duration);
  });
}

Promiseをreturnする書き方

Promiseを返しthenに渡す関数内にアサーションを書く方法。
wait()を実行すると、Promiseインスタンスが生成されるので、それをテスト関数の戻り値としてreturnすることで、Promiseが解決するまでテストの判定を待つ。
test("指定時間待つと、経過時間をもって resolve される", () => {
      return wait(50).then((duration) => {
        expect(duration).toBe(50);
      });
    });
 
resolvesを仕様したアサーションをreturnする方法
wait()がresolveしたときの値を検証したい場合、上記の方法よりシンプルに書ける。
test("指定時間待つと、経過時間をもって resolve される", () => {
      return expect(wait(50)).resolves.toBe(50);
    });

async/await を使った書き方

test("指定時間待つと、経過時間をもってresolveされる",async()=>{
  await expect(wait(50)).resolve.toBe(50);
});
 
検証値のPromiseが解決するのを待ってから、アサーションに展開する方法。
この方法の場合、他の非同期処理のアサーションも、1つのテスト関数内に収めることができる。
test("指定時間待つと、経過時間をもってresolveされる",async()=>{
  expect(await wait(50)).toBe(50);
});

© Hayato Kamiyama 2023 - 2024 - Build with Next.js & Notion