JavaScriptのエラーテスト:JasmineのtoThrowErrorマッチャーを使いこなそう
Jasmineでエラー発生を期待するテストを書く方法
テストケース
以下のコード例は、add
関数が正しくエラーを発生させることをテストする例です。
function add(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('引数は数値である必要があります');
}
return a + b;
}
describe('add 関数', function() {
it('引数が数値でない場合、エラーが発生すること', function() {
expect(() => add('a', 'b')).toThrowError('引数は数値である必要があります');
});
});
このテストケースでは、以下の点に注目しましょう。
describe
関数を使ってテスト対象の機能をグループ化している。it
関数を使って個々のテストケースを記述している。expect
関数を使って、テスト対象の動作を検証している。toThrowError
マッチャーを使って、特定のエラーメッセージが thrown されることを検証している。
テストの実行
上記のテストケースを実行するには、Jasmine のテストランナーを使用します。
npm install --global jasmine
jasmine add.spec.js
テストが成功すれば、以下の出力が表示されます。
Started
add 関数
✓ 引数が数値でない場合、エラーが発生すること (5ms)
Finished in 0.001s
1 test, 1 assertion, 0 failures, 0 errors
その他のマッチャー
toThrowError
マッチャー以外にも、様々なマッチャーが用意されています。
toBe
マッチャー: 値が等しいことを検証toEqual
マッチャー: オブジェクトの内容が等しいことを検証toBeGreaterThan
マッチャー: 値が大きいかどうかを検証toBeDefined
マッチャー: 変数が定義されていることを検証toBeNull
マッチャー: 変数が null であることを検証
詳細は、Jasmine の公式ドキュメントを参照してください。
Jasmine は、JavaScript のテストフレームワークとして広く利用されています。エラー発生を期待するテストも、toThrowError
マッチャーを使うことで簡単に記述できます。
上記の解説を参考に、Jasmine を活用してテストコードを書いてみてください。
function add(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('引数は数値である必要があります');
}
return a + b;
}
describe('add 関数', function() {
it('引数が数値でない場合、エラーが発生すること', function() {
expect(() => add('a', 'b')).toThrowError('引数は数値である必要があります');
});
it('引数が数値の場合、エラーが発生しないこと', function() {
expect(() => add(1, 2)).not.toThrow();
});
});
- 2つ目のテストケースは、
not.toThrow
マッチャーを使って、エラーが発生しないことを検証している。
テストの実行
npm install --global jasmine
jasmine add.spec.js
Started
add 関数
✓ 引数が数値でない場合、エラーが発生すること (5ms)
✓ 引数が数値の場合、エラーが発生しないこと (5ms)
Finished in 0.001s
2 tests, 2 assertions, 0 failures, 0 errors
以下のサンプルコードは、toThrowError
マッチャーの使い方をさらに詳しく説明しています。
- 特定のエラーオブジェクトが thrown されることを検証する例
const error = new Error('エラーが発生しました');
expect(() => throw error).toThrowError(error);
- エラーメッセージの一部が一致することを検証する例
expect(() => throw new Error('エラーが発生しました')).toThrowError(/エラーが発生/);
toThrowError
マッチャーを使うことで、エラー発生を期待するテストを簡単に記述できます。
上記のサンプルコードを参考に、様々なテストケースを書いてみてください。
エラー発生を期待するテストを書く他の方法
try-catch ブロックを使う
function add(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('引数は数値である必要があります');
}
return a + b;
}
try {
add('a', 'b');
fail('エラーが発生しませんでした');
} catch (error) {
expect(error.message).toBe('引数は数値である必要があります');
}
この方法では、try-catch
ブロックを使ってエラーをキャッチし、エラーメッセージを検証しています。
expect().toThrow()を使う
function add(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('引数は数値である必要があります');
}
return a + b;
}
expect(() => add('a', 'b')).toThrow();
この方法では、expect().toThrow()
を使って、エラーが発生することを検証しています。
jasmine.Spyを使う
function add(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('引数は数値である必要があります');
}
return a + b;
}
const spy = jasmine.Spy(add);
spy('a', 'b');
expect(spy).toThrowError('引数は数値である必要があります');
この方法では、jasmine.Spy
を使って、add
関数の呼び出しをスパイし、エラーが発生することを検証しています。
- シンプルなテストケースの場合は、
toThrowError
マッチャーを使うのが最も簡単です。 - エラーメッセージを検証する必要がある場合は、try-catch ブロックを使うのが良いでしょう。
add
関数の呼び出しを詳細に検証する必要がある場合は、jasmine.Spy
を使うのが良いでしょう。
エラー発生を期待するテストを書く方法はいくつかあります。状況に合わせて、適切な方法を選びましょう。
javascript testing node.js