Jasmine テストフレームワークで例外が投げられるのを想定したテストを記述する方法
2 notes
Jasmine で例外がスローされることを想定したテストを書きたいときありますよね。
そんなときは toThrow
を使うことで例外のテストができます。
describe('my suite ...', function() {
var hoge = function() {
return a + 1;
};
it('threw hoge exception', function() {
expect(hoge).toThrow();
});
it('threw hoge exception', function() {
expect(hoge).toThrow('e.message のメッセージ');
});
});
toThrow
の引数には投げられた例外が予期したものか指定できます。try...catch
の e.message
で取得できるメッセージがそれにあたります。
describe('my suite ...', function() {
it('threw hoge exception', function() {
expect(hoge).toThrow('a is not defined'); // Chrome の場合の例外メッセージ
});
});
しかし、e.message
で取得できるメッセージはブラウザーごとにバラつきがあったりします。
そんなときは引数を空にしておくことで例外が投げられたかどうかをテストできます。
describe('my suite ...', function() {
it('threw hoge exception', function() {
expect(hoge).toThrow();
});
});
PhantomJS でテストする場合は、ちゃんとメッセージが一致するかチェックしたほうが良いでしょう。
describe('my suite ...', function() {
it('threw hoge exception', function() {
expect(hoge).toThrow('Can\'t find variable: a'); // PhantomJS の場合の例外メッセージ
});
});
ブラウザーごとにメッセージが違うといっても、例外メッセージに想定した文字列が含まれているかどうかのテストもしたいことがあります。
そういった場合は it
内で明示的に try...catch
して、e.message
を toMatch
などで文字列検索するのが良いでしょう。
it('threw hoge exception', function() {
try {
hoge();
} catch (e) {
expect(e.message).toMatch('Can\'t find variable');
//expect(e.message).toMatch(/正規表現も可/);
}
});
上記のような書き方をみればお気づきかと思いますが、toThrow
の引数でメッセージをチェックするのも、明示的に try...catch
して toEqual
するのも同じということです。
(こういう利用方法はまずないとおもいますが)一点違うところは、テスト対象の関数内での未定義変数は toThrow
でチェックできますが、テストコード内で未定義の変数を参照しようとすると、当然 toThrow
ではキャッチできません。
it('threw fuga exception', function() {
expect(fuga).toThrow('Can\'t find variable: fuga'); // もちろんエラー
try {
fuga;
} catch (e) {
expect(e.message).toEqual('Can\'t find variable: fuga');
}
});
ご参考までに。