【超便利】Jest非同期テスト:toThrowでスマートなエラーハンドリングを実現
Jest で非同期テストで toThrow
を期待する方法
以下、その方法を詳しく説明します。
テスト環境をセットアップ
まず、Jest と必要なモックライブラリをプロジェクトにインストールする必要があります。
npm install jest [mock-library]
非同期テストを書く
非同期テストは、async
キーワードを使用してマークします。テストの中で、await
キーワードを使用して非同期操作を待機できます。
test('非同期操作がエラーをスローすることを確認する', async () => {
// 非同期操作を実行
await asyncOperation();
// エラーがスローされたことを確認
expect(() => operationThatThrowsError()).toThrow();
});
toThrow アサーションを使用する
toThrow
アサーションを使用して、特定のエラーがスローされることを期待できます。引数として、エラーメッセージ、エラーオブジェクト、またはその両方を使用できます。
test('特定のエラーメッセージがスローされることを確認する', async () => {
await asyncOperation();
expect(() => operationThatThrowsError()).toThrow('エラーメッセージ');
});
test('特定のエラーオブジェクトがスローされることを確認する', async () => {
await asyncOperation();
expect(() => operationThatThrowsError()).toThrow(new Error('エラーメッセージ'));
});
モックを使用する
非同期操作をモックを使用してテストすることもできます。これにより、実際の操作を実行せずにテストを分離できます。
jest.mock('./async-operation');
test('モックされた非同期操作がエラーをスローすることを確認する', async () => {
const asyncOperationMock = require('./async-operation');
// モックを設定
asyncOperationMock.mockImplementation(() => {
throw new Error('エラーメッセージ');
});
// 非同期操作を実行
await asyncOperation();
// エラーがスローされたことを確認
expect(() => operationThatThrowsError()).toThrow('エラーメッセージ');
});
- テスト対象のコードが複雑な場合は、テストをより小さく、集中したものに分割することをお勧めします。
- テストは、常に明確で簡潔であるように記述してください。
この例では、asyncOperation
という非同期操作をシミュレートする関数を定義します。この関数は、ランダムな確率でエラーをスローします。
async function asyncOperation() {
const shouldThrowError = Math.random() < 0.5;
if (shouldThrowError) {
throw new Error('エラーメッセージ');
}
}
このテストは、asyncOperation
関数が Error
オブジェクトをスローすることを確認します。
test('asyncOperation がエラーをスローすることを確認する', async () => {
await asyncOperation();
expect(() => asyncOperation()).toThrow();
});
特定のエラーメッセージがスローされることを確認する
このテストは、asyncOperation
関数が特定のエラーメッセージ ("エラーメッセージ") をスローすることを確認します。
test('asyncOperation が特定のエラーメッセージをスローすることを確認する', async () => {
await asyncOperation();
expect(() => asyncOperation()).toThrow('エラーメッセージ');
});
このテストは、asyncOperation
関数をモックを使用して、実際の操作を実行せずにテストします。
jest.mock('./async-operation');
test('モックされた asyncOperation がエラーをスローすることを確認する', async () => {
const asyncOperationMock = require('./async-operation');
// モックを設定
asyncOperationMock.mockImplementation(() => {
throw new Error('エラーメッセージ');
});
await asyncOperation();
expect(() => asyncOperation()).toThrow('エラーメッセージ');
});
- 特定のタイプのエラーオブジェクトがスローされることを確認する
- エラーメッセージの一部が一致することを確認する
- エラーハンドラーが適切に呼び出されることを確認する
resolves.toThrow
アサーションを使用して、Promise が特定のエラーをスローすることを確認できます。
test('Promise がエラーをスローすることを確認する', () => {
return expect(asyncOperation()).resolves.toThrow();
});
rejects アサーションを使用する
rejects
アサーションを使用して、Promise が拒否されることを確認できます。Promise が拒否された場合、そのエラーオブジェクトを使用して、toThrow
アサーションと同じように検証できます。
test('Promise が拒否されることを確認する', () => {
return expect(asyncOperation()).rejects.toThrow();
});
async/await と try/catch を使用する
async/await
と try/catch
を組み合わせて、非同期操作を制御し、エラーをキャッチできます。
test('非同期操作がエラーをスローすることを確認する', async () => {
try {
await asyncOperation();
} catch (error) {
expect(error).toThrow('エラーメッセージ');
}
});
どの方法を使用するべきか?
使用する方法は、テスト対象のコードと個人的な好みによって異なります。
toThrow
アサーションは、シンプルでわかりやすいので、一般的に最もよく使用されます。resolves.toThrow
およびrejects
アサーションは、Promise を扱う場合に役立ちます。async/await
とtry/catch
は、より複雑なテストシナリオを処理する場合に柔軟性を提供します。
推奨事項
- テストを明確かつ簡潔に保つために、必要な最小限のアサーションのみを使用してください。
- さまざまな方法を試して、自分に合った方法を見つけてください。
- テストコードが読みやすく、保守しやすいように、適切な命名規則とコーディングスタイルを使用してください。
javascript jestjs