web-dev-qa-db-ja.com

Jasmineは、スローされたエラーを識別する代わりに、expect()。toThrowでエラーをスローします

Javascriptでテスト駆動開発を学ぶという観点から、ひし形を印刷するための関数を実装しようとしています。

Diamond.prototype.outerSpace = function (current, widest) {

  var currentValue = this.getIndexOf(current);
  var widestValue = this.getIndexOf(widest);

  if (currentValue > widestValue) {
      throw new Error('Invalid combination of arguments');
  }

  var spaces = widestValue - currentValue;
  return new Array(spaces + 1).join(' ');
};

エラー処理に問題があります。 currentValueがwidestValueより大きい場合、上記の関数はエラーをスローするはずです。

これは、テスト/仕様を表す私のスニペットです。

it ("should throw an exception, if it is called with D and C", function () {
    var outerSpace = diamond.outerSpace.bind(diamond, 'D', 'C');
    expect(outerSpace).toThrow('Invalid combination of arguments');
});

Expect(..)の無名関数でも試しましたが、これも機能しませんでした。

コンソールメッセージは次のとおりです。「無効...」をスローする関数が必要ですが、エラー:引数の組み合わせが無効です。

わかりません。この情報をどうすればよいですか。

編集:それはジャスミンv.1.3で動作しているので奇妙ですが、ジャスミンに基づいたコードではありますが、ジャスミンv.2.3、つまりカルマでは動作しませんでした。

11
Texas

TL; DR

Jasmine 2では、マッチャーのセマンティクスが変更され、新しいマッチャーがあります。

toThrowError("<message>")またはtoThrow(new Error("<message>")))を使用します

NTL; TR

Jasmine 2.x以降、新しいマッチャーtoThrowError()があり、JasmineのtoThrow()が新しいセマンティクスになりました。

  • toThrow()は、エラーがスローされたかどうかを確認するか、Errorのメッセージを確認するために使用する必要があります(より具体的には、instanceof Error
  • toThrowError()を使用して、specificエラーがスローされたかどうか、またはエラーのメッセージが期待値と等しいかどうかを確認する必要があります

内部的には、toThrow(x)はスローされたエラーの等価性チェックをxに対して行います。エラーとxの両方がinstanceof Errorの場合(たとえば、TypeErrorにも当てはまります)、Jasmineは両側のmessage属性の同等性(一般に===)をチェックします。

フォームtoThrowError(x)は、エラーメッセージがx(文字列または正規表現)と等しいか一致するかをチェックします。

もう1つの形式toThrowError(t, x)は、エラーのタイプがtであり、メッセージがx(文字列または正規表現)と等しいか一致するかどうかを確認します

見る

13