質問編集履歴

1 タイポ

van-0215

van-0215 score 89

2019/05/14 01:20  投稿

JESTでPromiseの再帰処理をテストする方法
JESTでPromiseの再帰処理をテストする方法がわかりません。
JESTを用いてテストを書いています。
このテストではPromiseが解決されるまで、再帰処理を行うretry関数がテストの対象です。
```TypeScript
export function retry<T>(fn: () => Promise<T>, limit: number = 5, interval: number = 10): Promise<T> {
 return new Promise((resolve, reject) => {
   fn()
     .then(resolve)
     .catch((error) => {
       setTimeout(async () => {
         // 上限リトライ数を超えたらrejectする
         if (limit === 1) {
           reject(error);
           return;
         }
         // 上限リトライ数未満だったらコールバックの再帰処理を行う
         await retry(fn, limit - 1, interval);
       }, interval);
     });
 });
}
```
上記の retry関数に対して以下のテストを行います。
①必ず resolve する Promise を渡し、1度目の実行で retry 関数が resolve されること
②3度目の実行で resolve する Promise を渡し、3度目の実行 で retry 関数が resolve されること
これらをJESTで書くと以下のようになるのかと私は思いました。
```JavaScript
describe('retry', () => {
 test('resolve on the first call', async () => {
   const fn = jest.fn().mockResolvedValue('resolve!');
   await retry(fn);
   expect(fn.mock.calls.length).toBe(1);
 });
 
 test('resolve on the third call', async () => {
   const fn = jest.fn()
              .mockRejectedValueOnce(new Error('Async error'))
              .mockRejectedValueOnce(new Error('Async error'))
              .mockResolvedValue('OK');
   expect(fn.mock.calls.length).toBe(3)
 });
});
```
結果、下記のようなエラーで失敗しました。
```
Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.Error:
   > 40 |  test('resolve on the third call', async () => {
        |  ^
     41 |    const fn = jest
     42 |      .fn()
     43 |      .mockRejectedValueOnce(new Error('Async error'))
```
このエラーに関してはJESTの設定でなんとかなると思います。しかしながら、根本的な話、JESTでPromiseの再帰処理をテストする方法がこれであっているのかがわかりません。
これはかなりのレアケースな気がするので、
このエラーに関してはJESTの設定でなんとかなると思います。しかしながら、根本的な話、JESTでPromiseの再帰処理をテストする方法がこれであっているのかがわかりません。
  • JavaScript

    31592 questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • TypeScript

    1373 questions

    TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る