ホームページ  >  記事  >  ウェブフロントエンド  >  Mocha/Chai の「expect.to.throw」アサーションがスローされたエラーをキャッチできないのはなぜですか?

Mocha/Chai の「expect.to.throw」アサーションがスローされたエラーをキャッチできないのはなぜですか?

DDD
DDDオリジナル
2024-11-18 03:02:02419ブラウズ

Why Does My Mocha/Chai `expect.to.throw` Assertion Fail to Catch Thrown Errors?

Mocha/Chai Expect.to.throw パズル: スローされたエラーのキャッチ

Chai の Expect.to.throw アサーションはキャッチが難しいようですエラーが正しくスローされました。テスト ケースを作成したにもかかわらず、expect.to.throw を使用したアサーションは繰り返し失敗します。

明確にするために、次のコード スニペットを考えてみましょう。

it('should throw an error if you try to get an undefined property', function (done) {
  var params = { a: 'test', b: 'test', c: 'test' };
  var model = new TestModel(MOCK_REQUEST, params);

  expect(model.get('z')).to.throw('Property does not exist in model schema.');
  expect(model.get('z')).to.throw(new Error('Property does not exist in model schema.'));
});

結局のところ、問題は、expect.to.throw に式を渡す方法にあります。

解決策: をラップするFunction

この問題を修正するには、後で呼び出す関数を Expect.to.throw に渡す必要があります。次の調整されたコードは意図したとおりに動作するようになりました。

it('should throw an error if you try to get an undefined property', function (done) {
  var params = { a: 'test', b: 'test', c: 'test' };
  var model = new TestModel(MOCK_REQUEST, params);

  expect(model.get.bind(model, 'z')).to.throw('Property does not exist in model schema.');
  expect(model.get.bind(model, 'z')).to.throw(new Error('Property does not exist in model schema.'));
});

bind メソッドを使用して、呼び出されたときに、これをモデルに設定し、初期引数を設定して model.get を呼び出す新しい関数を作成します。

バインディングの説明

このコンテキストでは、バインドは重要な役割を果たします。 役割。これは、元の関数と同じ引数を受け入れますが、呼び出されたときに特定の値を持つ新しい関数を生成します。この場合、 this の値は model で、引数は 'z' です。

model.get('z') の結果を Expect.to.throw に渡すとき、基本的にスローされたものを渡します。アサーションのエラー。ただし、expect.to.throw の目的は、指定された関数が呼び出されたときに例外がスローされるかどうかを確認することです。したがって、関数の結果ではなく関数自体を渡す必要があります。バインド メソッドを使用すると、まさにそれが可能になります。

バインドの詳細については、提供されているリンクを参照してください。

以上がMocha/Chai の「expect.to.throw」アサーションがスローされたエラーをキャッチできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。