JavaScriptエンジニア必須スキル!Jestで例外処理をテストする方法をマスターしよう

2024-06-29

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

toThrow() マッチャー:

最も基本的な方法は、toThrow() マッチャーを使用する方法です。 このマッチャーは、関数が例外をスローするかどうかを検証します。 例外の種類については何もチェックしません。

test('関数が例外をスローするかどうかをテストする', () => {
  expect(() => {
    throw new Error('エラーメッセージ');
  }).toThrow();
});

toThrowError() マッチャーは、toThrow() マッチャーと似ていますが、例外の種類も検証できます。 引数として、期待される例外のインスタンスまたはその部分文字列を渡すことができます。

test('関数が特定の型の例外をスローするかどうかをテストする', () => {
  expect(() => {
    throw new CustomError('エラーメッセージ');
  }).toThrowError(CustomError); // 例外の型を完全一致で検証
});

test('関数がエラーメッセージを含む例外をスローするかどうかをテストする', () => {
  expect(() => {
    throw new Error('エラーメッセージ');
  }).toThrowError(/エラーメッセージ/); // エラーメッセージの部分一致で検証
});

rejects マッチャー (非同期処理の場合):

非同期処理で例外をスローする関数をテストする場合は、rejects マッチャーを使用します。 このマッチャーは、Promiseが拒否される (つまり、例外がスローされる) ことかどうかを検証します。 引数として、期待される例外のインスタンスまたはその部分文字列を渡すことができます。

test('非同期関数が例外をスローするかどうかをテストする', async () => {
  const asyncFunction = async () => {
    throw new Error('エラーメッセージ');
  };

  await expect(asyncFunction()).rejects(); // 例外がスローされることを検証
});

test('非同期関数がエラーメッセージを含む例外をスローするかどうかをテストする', async () => {
  const asyncFunction = async () => {
    throw new Error('エラーメッセージ');
  };

  await expect(asyncFunction()).rejects(/エラーメッセージ/); // エラーメッセージの部分一致で検証
});

補足:

  • テスト対象のコードが複雑な場合は、複数のマッチャーを組み合わせて使用することもできます。

これらの方法を組み合わせることで、Jestでスローされた例外の種類を効果的にテストすることができます。




    toThrow() マッチャー

    // ファイル: example.js
    
    function someFunction() {
      throw new Error('エラーメッセージ');
    }
    
    // ファイル: example.test.js
    
    test('関数が例外をスローするかどうかをテストする', () => {
      expect(() => someFunction()).toThrow();
    });
    

    toThrowError() マッチャー

    // ファイル: example.js
    
    class CustomError extends Error {
      constructor(message) {
        super(message);
      }
    }
    
    function someFunction() {
      throw new CustomError('エラーメッセージ');
    }
    
    // ファイル: example.test.js
    
    test('関数が特定の型の例外をスローするかどうかをテストする', () => {
      expect(() => someFunction()).toThrowError(CustomError); // 例外の型を完全一致で検証
    });
    
    test('関数がエラーメッセージを含む例外をスローするかどうかをテストする', () => {
      expect(() => someFunction()).toThrowError(/エラーメッセージ/); // エラーメッセージの部分一致で検証
    });
    

    rejects マッチャー

    // ファイル: example.js
    
    async function someAsyncFunction() {
      throw new Error('エラーメッセージ');
    }
    
    // ファイル: example.test.js
    
    test('非同期関数が例外をスローするかどうかをテストする', async () => {
      await expect(someAsyncFunction()).rejects(); // 例外がスローされることを検証
    });
    
    test('非同期関数がエラーメッセージを含む例外をスローするかどうかをテストする', async () => {
      await expect(someAsyncFunction()).rejects(/エラーメッセージ/); // エラーメッセージの部分一致で検証
    });
    

    これらのサンプルコードを参考に、それぞれの方法の使い方を理解し、実際のテストコードに活用してください。




    Jestでスローされた例外の型をテストする方法:その他の方法

    try...catch ブロックを使用する:

    最もシンプルな方法は、try...catch ブロックを使用して、例外を捕捉し、その型を検証する方法です。

    test('関数が特定の型の例外をスローするかどうかをテストする', () => {
      try {
        someFunction();
      } catch (error) {
        expect(error).toBeInstanceOf(CustomError); // 例外の型を検証
      }
    });
    

    expect().toHaveProperty('name') マッチャーを使用して、例外の name プロパティが期待される値であることを検証する方法もあります。

    test('関数が特定の名前を持つ例外をスローするかどうかをテストする', () => {
      expect(() => someFunction()).toThrowError(new Error('エラーメッセージ'));
    });
    

    断言ライブラリを使用する:

    Jest以外の断言ライブラリを使用する方法もあります。 例えば、ChaiSinon などのライブラリは、例外の検証機能を提供しています。

    const chai = require('chai');
    const expect = chai.expect;
    
    test('関数が特定の型の例外をスローするかどうかをテストする', () => {
      expect(() => someFunction()).to.throw(CustomError); // Chaiの断言を使用
    });
    

    それぞれの方法の нюアンス:

    • toThrow() マッチャーは、最もシンプルで汎用性の高い方法ですが、例外の種類については何もチェックしません。
    • toThrowError() マッチャーは、例外の種類をより詳細に検証できますが、try...catch ブロックを使用する方法よりも冗長になる可能性があります。
    • rejects マッチャーは、非同期処理でスローされる例外をテストする場合にのみ使用できます。
    • try...catch ブロックを使用する方法は、シンプルでわかりやすいですが、テストコードが煩雑になる可能性があります。
    • expect().toHaveProperty('name') マッチャーは、例外の名前のみを検証する必要がある場合にのみ使用できます。
    • 断言ライブラリを使用する方法は、より柔軟性と機能性を提供できますが、Jestの組み込み機能よりも習得に時間がかかる場合があります。

    どの方法を使用するかは、テストの対象と要件によって異なります。 上記で紹介した方法を理解し、状況に応じて適切な方法を選択してください。

      上記の情報に加えて、Jest公式ドキュメント https://jestjs.io/ やその他のブログ記事やチュートリアルを参照することで、Jestで例外処理をテストする方法についてさらに詳しく学ぶことができます。


      javascript unit-testing jestjs


      JavaScript:スプレッド構文を使用して正規表現に変数を使う

      JavaScriptで正規表現を使用する際、パターンの一部を動的に変化させたい場合、変数を使うことができます。方法変数を使う方法は2つあります。リテラル正規表現RegExp コンストラクタどちらの方法でも同じ結果になりますが、一般的にはリテラル正規表現の方が簡潔で読みやすいのでおすすめです。...


      JavaScript、jQuery、HTML でフォームの送信前にすべての値を取得する方法

      JavaScriptFormData オブジェクトは、フォームのすべての値を取得する最も簡単な方法です。各要素の value プロパティを使用するFormData オブジェクトを使用せずに、各フォーム要素の value プロパティを使用して値を取得することもできます。...


      【2つの方法】JavaScriptとHTMLでクリックされたボタンのIDを取得する方法(サンプルコード付き)

      このページでは、JavaScriptとHTMLを用いて、クリックされたボタンのIDを取得する方法について解説します。方法以下の2つの方法を紹介します。HTMLのonclick属性JavaScriptのaddEventListener()メソッド...


      ReactJSでcontrolled componentsとuncontrolled components

      refを使用して、入力フィールドのDOM要素への参照を取得できます。その後、ref. current. valueを使用して、その要素の値を取得できます。useStateを使用して、入力フィールドの値を状態変数に格納できます。その後、useStateフックの2番目の要素を使用して、その値を取得できます。...


      JavaScript、Angular、RxJSで実現!.pipe()と.subscribe()の魔法

      RxJSは、非同期データストリームを扱うためのReactiveXライブラリの実装の一つです。Angularなどのフレームワークで広く使用されており、非同期処理を簡潔かつ効率的に処理することができます。このチュートリアルでは、RxJSにおける...