Jest例外テスト解説
Jestで投げられた例外の型をテストする方法
日本語解説
Jestでは、関数が特定のタイプの例外を投げるかどうかをテストすることができます。これは、コードのエラー処理を検証する上で非常に重要です。
基本的な手順
- 例外を期待する関数
テスト対象の関数を呼び出します。 - 例外のキャッチ
try...catch
ブロックを使用して例外をキャッチします。 - 例外の型チェック
instanceof
演算子を使用して、キャッチした例外の型を確認します。 - アサーション
expect
関数を使用して、例外の型が期待したものと一致することをアサートします。
コード例
function divideByZero() {
throw new Error('Division by zero');
}
test('should throw an Error when dividing by zero', () => {
expect(() => divideByZero()).toThrow();
expect(() => divideByZero()).toThrow(Error);
});
解説
expect(() => divideByZero()).toThrow(Error);
: このアサーションは、divideByZero
関数がError
型の例外を投げることを確認します。
追加のポイント
- 否定的なテスト
not.toThrow()
を使用して、例外が投げられないことを確認することもできます。 - 複数の例外
複数の例外を期待する場合には、toThrow()
の引数に配列を渡すことができます。 - カスタム例外
独自の例外クラスを作成して、より具体的なエラーメッセージや情報を提供することができます。
function divideByZero() {
throw new Error('Division by zero');
}
test('should throw an Error when dividing by zero', () => {
expect(() => divideByZero()).toThrow();
expect(() => divideByZero()).toThrow(Error);
});
カスタム例外の例
class CustomError extends Error {
constructor(message) {
super(message);
this.name = 'CustomError';
}
}
function throwCustomError() {
throw new CustomError('Custom err or');
}
test('should throw a CustomError', () => {
expect(() => throwCustomError()).toThrow(CustomError);
});
expect(() => throwCustomError()).toThrow(CustomError);
: このアサーションは、throwCustomError
関数がCustomError
型の例外を投げることを確認します。CustomError
クラスは、カスタム例外を定義しています。
複数の例外の例
function throwMultipleErrors() {
if (Math.random() < 0.5) {
throw new Error('Error 1');
} else {
throw new RangeError('Error 2');
}
}
test('should throw either Error or RangeError', () => {
expect(() => throwMultipleErrors()).toThrow(Error);
expect(() => throwMultipleErrors()).toThrow(RangeError);
});
expect(() => throwMultipleErrors()).toThrow(Error);
とexpect(() => throwMultipleErrors()).toThrow(RangeError);
の両方のアサーションが成功する必要があります。throwMultipleErrors
関数は、ランダムにError
またはRangeError
を投げます。
Jestで例外の型をテストする代替方法
Jestでは、例外の型をテストするさまざまな方法があります。以下に、いくつかの代替方法を紹介します。
toThrowError()メソッド:
toThrowError()
メソッドは、例外のメッセージやプロパティを指定してテストすることができます。
test('should throw an error with a specific message', () => {
expect(() => divideByZero()).toThrowError('Division by zero');
});
カスタムマッチャー:
- Jestのカスタムマッチャーを作成して、より複雑な例外の検証を行うことができます。
expect.extend({
toThrowCustomError: (received) => {
if (!(received instanceof CustomError)) {
throw new Error('Expected a CustomError');
}
return { pass: true };
},
});
test('should throw a CustomError', () => {
expect(() => throwCustomError()).toThrowCustomError();
});
アサーションライブラリ:
- Jest以外のアサーションライブラリを使用することもできます。例えば、ChaiやJasmineは、より柔軟な例外テストを提供します。
const chai = require('chai');
const expect = chai.expect;
test('should throw an Error', () => {
expect(() => divideByZero()).to.throw(Error);
});
モックフレームワーク:
- モックフレームワークを使用して、関数の挙動を制御し、例外のテストを簡略化することができます。
const { mock } = require('jest-mock');
test('should throw an error when a mocked function fails', () => {
const mockedFunction = jest.fn().mockImplementation(() => {
throw new Error('Mocked function error');
});
expect(() => mockedFunction()).toThrowError('Mocked function error');
});
javascript unit-testing jestjs