jasmineで例外をテストする

  • 9
    Like
  • 0
    Comment
More than 1 year has passed since last update.

jasmineについて

jasmineはjavascript用のテストフレームワークです。
以下の様な感じでテストを書くことが出来ます。

describe('example', function() {
  it('example', function() {
    expect(1+2).toBe(3);  // 1+2=3であるか...成功
    expect(true).toBeFalsy(); //trueはfalseか...失敗
  });
});

jasmineの記法については、公式サイトやQiitaに詳しい記事がありますので、そちらを御覧ください。
この記事ではjasmineでの例外テストについて記述しています。

jasmineで例外テストを実装する

関数を実行した際に例外が発生するかを.toThrow()でテストできます。

expect(func).toThrow();

また例外の内容を引数に指定すると、エラー内容が正しいかなどもテストできます。

expect(func).toThrow(new Error('This is Error.'));

具体例

Example.js
function Example() {}
Example.prototype.errorFunc = function() {
  throw new Error('エラー');
};
module.exports = Example;
ExampleSpec.js
describe('Exampleテスト', function() {
  var Example = require('Example');
  var example = new Example();

  it('例外の発生を確認', function() {
    expect(example.errorFunc).toThrow();
  });

  it('例外でエラーを投げているのを確認', function() {
    expect(example.errorFunc).toThrow(new Error('エラー'));
  });

});

困ったときは (Actual is not a Function)

テストが動かない場合、expectに渡している関数を実行してしまっている可能性があります。
関数に引数を渡す必要がある場合はfunctionで囲えば解決できます。

Example.js
function Example() {}
Example.prototype.errorFunc = function(argument) {
  if (argument == 'NG') {
    throw new Error('エラー');
  }
};
module.exports = Example;
ExampleSpec.js
describe('Exampleテスト', function() {
  var Example = require('Example');
  var example = new Example();

  it('誤った実装例1', function() {
    expect(example.errorFunc('OK')).toThrow();
    // Actual is not a Function
    // expectの引数には関数を指定する必要がある。
  });
  it('誤った実装例2', function() {
    expect(example.errorFunc('NG')).toThrow();
    // Error: エラー
    // Exampleの例外が発生し、テストが終了してしまう。
  });
  it('正しい実装例1', function() {
    expect(function() {
      example.errorFunc('OK');
    }).toThrow(); // テスト失敗(例外が発生しない)
  });
  it('正しい実装例2', function() {
    expect(function() {
      example.errorFunc('NG');
    }).toThrow(); // テスト成功(例外が発生する)
  });

});

リファレンス

jasmine公式サイト
qiita - Jasmine使い方メモ
stackoverflow - How to write a test which expects an Error to be thrown