ARTICLE

Jasmine テストフレームワークで例外が投げられるのを想定したテストを記述する方法

Jasmine Console Report Image

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...catche.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.messagetoMatch などで文字列検索するのが良いでしょう。

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');
    }
});

ご参考までに。

Jasmine HTML Report

参考記事

最後まで読んでいただきありがとうございました。
この記事が気に入っていただけたらシェアしてくれるとブログ運営の励みなります。
blog comments powered by Disqus
  1. tetsuwo posted this

Categories