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中文網其他相關文章!