Treci la conținutul principal

Funcții care pot eșua

O funcție care poate primi date greșite trebuie să spună acest lucru. Modul obișnuit este să arunce o eroare: la succes funcția își returnează rezultatul, iar la eșec aruncă un Error care explică ce nu a mers bine.

Un test pentru o astfel de funcție trebuie să verifice ambele căi: date corecte returnează valoarea potrivită și nu aruncă nicio eroare, iar date greșite chiar aruncă o eroare — o funcție care acceptă în tăcere date greșite este tot o eroare de program.

assert.throws(fn) este verificarea pentru calea greșită. Pentru o funcție care returnează o promisiune, aceeași verificare se scrie assert.rejects(fn) și se așteaptă cu await.


Calea corectă

Pentru date valide nu ai nimic în plus de scris. Apelezi funcția, apoi compari valoarea. Dacă apelul aruncă totuși o eroare, aruncarea încheie testul de la sine, iar raportul arată eroarea — nu trebuie să verifici acest lucru dinainte.

Date valide, fără eroare

safeDivide(10, 2) trebuie să returneze 5 și nu trebuie să arunce nicio eroare. Apelul vine primul; o eroare neașteptată ar încheia testul chiar acolo. Abia apoi este comparată valoarea.

Prompt
Scrie un fișier de test TypeScript cu o funcție safeDivide care returnează un număr și aruncă un RangeError atunci când împărțitorul este zero. Testează calea corectă: safeDivide(10, 2) trebuie să returneze 5 și nu trebuie să arunce nicio eroare. Arată rezultatul care trece.
Ieșire: program TypeScript și rezultatul capturat
Valid input, no error

Calea greșită

Cealaltă jumătate a contractului: datele greșite trebuie să ducă la eșec. assert.throws primește o funcție mică ce face apelul, o rulează și eșuează dacă nu a fost aruncată nicio eroare.

Poți spune și ce anume trebuie aruncat. Dacă transmiți clasa erorii ca al doilea argument, testul eșuează atunci când iese un alt fel de eroare.

Datele greșite trebuie să arunce o eroare

Împărțirea la zero trebuie să eșueze. assert.throws apelează safeDivide(10, 0) și cere un RangeError. Dacă funcția ar returna în schimb un număr, testul ar eșua — a acceptat date pe care ar fi trebuit să le respingă.

Prompt
Scrie un test TypeScript pentru calea greșită a funcției safeDivide: apelarea ei cu împărțitorul 0 trebuie să arunce o eroare. Folosește assert.throws cu RangeError ca eroare așteptată. Arată rezultatul care trece.
Ieșire: program TypeScript și rezultatul capturat
Bad input must throw

Un tabel cu wantErr

Ambele căi încap într-un singur test bazat pe tabel: dă fiecărui caz un câmp wantErr care spune dacă se așteaptă o eroare. Câmpul want este opțional, pentru că un caz care aruncă o eroare nu are nicio valoare de comparat.

Fiecare subtest se uită mai întâi la wantErr. Eșecurile așteptate sunt verificate cu assert.throws și se opresc acolo; celelalte cazuri compară valoarea ca de obicei.

Cazuri bune și rele într-un singur tabel

Patru cazuri: trei împărțiri obișnuite și o împărțire la zero cu wantErr: true. O singură buclă acoperă tot contractul funcției, iar toate cele patru subteste trec.

Prompt
Scrie un test TypeScript bazat pe tabel pentru safeDivide, în care fiecare caz are un nume, cele două date de intrare, o valoare așteptată opțională și un boolean wantErr. Folosește subteste t.test așteptate cu await; verifică eșecul așteptat cu assert.throws și compară valoarea pentru celelalte cazuri. Include trei cazuri obișnuite și o împărțire la zero. Arată rezultatul.
Ieșire: program TypeScript și rezultatul capturat
Good and bad cases in one table