จากการสัมผัส (แม้ว่าจะ จำกัด ) ต่อ Jest ฉันพบว่าexpect().toThrow()
เหมาะสำหรับกรณีที่คุณต้องการทดสอบเท่านั้นข้อผิดพลาดจะถูกโยนทิ้งไปบางประเภท:
expect(() => functionUnderTest()).toThrow(TypeError);
หรือเกิดข้อผิดพลาดพร้อมข้อความเฉพาะ:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
หากคุณพยายามทำทั้งสองอย่างคุณจะได้รับผลบวกลวง ตัวอย่างเช่นหากโค้ดของคุณพ่นRangeError('Something bad happened!')
การทดสอบนี้จะผ่าน:
expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
คำตอบโดย bodolsog ซึ่งแนะนำให้ใช้ try / catch นั้นใกล้เคียง แต่แทนที่จะคาดหวังว่าจริงจะเป็นเท็จเพื่อให้แน่ใจว่าการยืนยันที่คาดหวังในการจับจะถูกตีคุณสามารถใช้แทนได้expect.assertions(2)
เมื่อเริ่มการทดสอบของคุณโดยที่2
จำนวนการยืนยันที่คาดไว้คือ . ฉันรู้สึกว่านี่อธิบายจุดประสงค์ของการทดสอบได้ถูกต้องมากขึ้น
ตัวอย่างทั้งหมดของการทดสอบประเภท AND ข้อความของข้อผิดพลาด:
describe('functionUnderTest', () => {
it('should throw a specific type of error.', () => {
expect.assertions(2);
try {
functionUnderTest();
} catch (error) {
expect(error).toBeInstanceOf(TypeError);
expect(error).toHaveProperty('message', 'Something bad happened!');
}
});
});
หากfunctionUnderTest()
ไม่เกิดข้อผิดพลาดการยืนยันจะถูกตี แต่expect.assertions(2)
จะล้มเหลวและการทดสอบจะล้มเหลว