JavaScriptエンジニア必須スキル!Jestで例外処理をテストする方法をマスターしよう
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以外の断言ライブラリを使用する方法もあります。 例えば、Chai や Sinon などのライブラリは、例外の検証機能を提供しています。
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