ホームページ > 記事 > ウェブフロントエンド > Mocha/Chai の「expect.to.throw」アサーションがスローされたエラーをキャッチできないのはなぜですか?
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 サイトの他の関連記事を参照してください。