Jest'e (sınırlı da olsa) maruz kalmamdan, expect().toThrow()
SADECE belirli bir türden bir hatanın atıldığını test etmek istiyorsanız bunun uygun olduğunu buldum :
expect(() => functionUnderTest()).toThrow(TypeError);
VEYA belirli bir mesajla bir hata atılır:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
İkisini de yapmaya çalışırsanız, yanlış bir pozitif alırsınız. Örneğin, kodunuz atarsa RangeError('Something bad happened!')
, bu test geçecektir:
expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
Bir dene / yakala kullanmayı öneren bodolsog tarafından verilen cevap yakındır, ancak yakalamadaki beklenen iddiaların tutturulmasını sağlamak için doğru olmasını beklemek yerine expect.assertions(2)
, testinizin başında 2
beklenen iddiaların sayısının olduğu yerde kullanabilirsiniz . . Bunun testin amacını daha doğru tanımladığını düşünüyorum.
Bir hatanın türünü VE mesajını test etmenin tam örneğ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!');
}
});
});
Bir functionUnderTest()
hata ATMAZSA, iddialar tutulur, ancak expect.assertions(2)
başarısız olur ve test başarısız olur.