Từ sự tiếp xúc (mặc dù có giới hạn) của tôi với Jest, tôi đã thấy điều đó expect().toThrow()
phù hợp nếu bạn muốn CHỈ kiểm tra một lỗi được đưa ra theo một loại cụ thể:
expect(() => functionUnderTest()).toThrow(TypeError);
HOẶC một lỗi được ném với một thông báo cụ thể:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
Nếu bạn cố gắng làm cả hai, bạn sẽ nhận được một dương tính giả. Ví dụ: nếu mã của bạn ném RangeError('Something bad happened!')
, bài kiểm tra này sẽ vượt qua:
expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
Câu trả lời của bodolsog trong đó gợi ý sử dụng thử / bắt là gần, nhưng thay vì kỳ vọng đúng là sai để đảm bảo các xác nhận kỳ vọng trong sản phẩm khai thác được thực hiện, thay vào đó, bạn có thể sử dụng expect.assertions(2)
khi bắt đầu thử nghiệm trong đó 2
số xác nhận dự kiến . Tôi cảm thấy điều này mô tả chính xác hơn ý định của bài kiểm tra.
Ví dụ đầy đủ về việc kiểm tra loại AND thông báo lỗi:
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!');
}
});
});
Nếu functionUnderTest()
KHÔNG ném lỗi, các xác nhận sẽ bị đánh nhưng expect.assertions(2)
sẽ không thành công và kiểm tra sẽ thất bại.