558

エラーが予想されるJasmine Test Frameworkのテストを作成しようとしています。現時点では、GitHub の Jasmine Node.js 統合を使用しています。

Node.js モジュールには、次のコードがあります。

throw new Error("Parsing is not possible");

今、私はこのエラーを期待するテストを書き込もうとしています:

describe('my suite...', function() {
    [..]
    it('should not parse foo', function() {
    [..]
        expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));
    });
});

私も他のいくつかのバリアントを試しError()ましたが、それを機能させる方法がわかりません。

4

10 に答える 10

898

代わりに匿名関数を使用してみてください。

expect( function(){ parser.parse(raw); } ).toThrow(new Error("Parsing is not possible"));

expect(...)関数を呼び出しに渡す必要があります。あなたの間違ったコード:

// incorrect:
expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));

に結果を渡すために実際に呼び出そ うとしていますが、parser.parse(raw)expect(...)

于 2010-11-10T13:13:50.637 に答える
82

あなたが使用している:

expect(fn).toThrow(e)

しかし、関数のコメントを見ると(期待されるのは文字列です):

294 /**
295  * Matcher that checks that the expected exception was thrown by the actual.
296  *
297  * @param {String} expected
298  */
299 jasmine.Matchers.prototype.toThrow = function(expected) {

おそらく次のように書くべきだと思います(ラムダ-匿名関数を使用):

expect(function() { parser.parse(raw); } ).toThrow("Parsing is not possible");

これは、次の例で確認できます。

expect(function () {throw new Error("Parsing is not possible")}).toThrow("Parsing is not possible");

Douglas Crockfordは、"throw new Error()" (プロトタイピングの方法) を使用する代わりに、このアプローチを強く推奨しています。

throw {
   name: "Error",
   message: "Parsing is not possible"
}
于 2010-11-10T13:06:22.480 に答える
24

Jasmine の toThrow マッチャーを次のように置き換えます。これにより、例外の name プロパティまたはその message プロパティで一致させることができます。私にとっては、次のことができるので、これによりテストが書きやすくなり、脆弱性が少なくなります。

throw {
   name: "NoActionProvided",
   message: "Please specify an 'action' property when configuring the action map."
}

次に、次のようにテストします。

expect (function () {
   .. do something
}).toThrow ("NoActionProvided");

これにより、後でテストを中断せずに例外メッセージを微調整できます。重要なことは、予想されるタイプの例外がスローされたということです。

これは、これを可能にする toThrow の置き換えです。

jasmine.Matchers.prototype.toThrow = function(expected) {
  var result = false;
  var exception;
  if (typeof this.actual != 'function') {
    throw new Error('Actual is not a function');
  }
  try {
    this.actual();
  } catch (e) {
    exception = e;
  }
  if (exception) {
      result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected) || this.env.equals_(exception.name, expected));
  }

  var not = this.isNot ? "not " : "";

  this.message = function() {
    if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
      return ["Expected function " + not + "to throw", expected ? expected.name || expected.message || expected : " an exception", ", but it threw", exception.name || exception.message || exception].join(' ');
    } else {
      return "Expected function to throw an exception.";
    }
  };

  return result;
};
于 2011-07-28T10:15:26.597 に答える
12

それはより多くのコードであることは知っていますが、次のこともできます。

try
    Do something
    @fail Error("should send a Exception")
catch e
    expect(e.name).toBe "BLA_ERROR"
    expect(e.message).toBe 'Message'
于 2014-02-19T03:16:36.407 に答える
6

CoffeeScript愛好家向け:

expect( => someMethodCall(arg1, arg2)).toThrow()
于 2014-02-15T17:41:05.950 に答える
6

私の場合、エラーをスローする関数はasyncだったので、これに従いました:

await expectAsync(asyncFunction()).toBeRejected();
await expectAsync(asyncFunction()).toBeRejectedWithError(...);
于 2020-07-23T17:40:13.250 に答える
1
it('it should fail', async () => {
    expect.assertions(1);

    try {
        await testInstance.doSomething();
    }
    catch (ex) {
        expect(ex).toBeInstanceOf(MyCustomError);
    }
});
于 2021-08-10T19:30:23.850 に答える