首頁  >  文章  >  web前端  >  為什麼我的 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的方式。

解決方案:包裝函數

為了修正這個問題,我們需要將一個函數傳遞給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.'));
});

透過使用綁定方法,我們建立一個新函數,在呼叫時,將呼叫model.get 並將此設為model 並設定初始參數到'z'。

綁定說明

在這種情況下,綁定起著至關重要的作用 角色。它會產生一個新函數,該函數接受與原始函數相同的參數,但在呼叫時具有特定的值。在我們的例子中,this 值為 model,參數為 'z'。

當我們將 model.get('z') 的結果傳遞給 Expect.to.throw 時,我們實際上傳遞了拋出的斷言錯誤。然而,expect.to.throw的目的是檢查給定函數在呼叫時是否會拋出異常。因此,我們必須傳遞函數本身而不是它的結果。綁定方法使我們能夠做到這一點。

要更深入地了解綁定,請參閱提供的連結。

以上是為什麼我的 Mocha/Chai `expect.to.throw` 斷言無法捕捉拋出的錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn