Testarea unui API Node.js

Introducere

Testele sunt importante; acestea oferă o protecție pentru aplicațiile sau API-urile dvs. În calitate de începători, este posibil să nu fiți atenți la necesitatea de a scrie teste care să acopere părțile importante ale ceea ce construiți. Cu toate acestea, vă veți întâlni în timp ce faceți progrese în calitate de dezvoltator.

Într-un tutorial anterior, ați învățat cum să construiți un API cu Node.js. Dacă nu ați trecut prin ea, vă sugerez să faceți acest lucru înainte de a continua acest lucru. În acest tutorial, veți scrie teste pentru un API construit folosind Node.js și Express. La sfârșitul acestui tutorial, veți ști cum funcționează testarea în Node.js și veți putea să construiți API-uri funcționale și testate.

Instrumente de testare

Veți folosi Mocha, Expect și Supertest.

Cafea este un cadru de testare JavaScript care face testarea asincronă simplă și distractivă. Mocha vine cu multe caracteristici extraordinare care pot fi găsite pe site. Veți folosi o mână de ele.

Aştepta este o bibliotecă de afirmații care vă face ușor să faceți afirmații mai bune. Veți vedea cum funcționează. Supertest oferă o abstracție la nivel înalt pentru testarea HTTP. Acest lucru este necesar deoarece veți testa un API.

Vorbește destul, e timpul să scrii un cod.

Setarea proiectului

Am un proiect de liste de sarcini deja creat pentru tine. Modelul, fișierul de configurare și o parte din app.js sunt deja efectuate pentru dvs. Du-te la GitHub și clona depozitul. Sau puteți pur și simplu:

git clone https://github.com/izuchukwu1/node-todo-api.git

Package.json ar trebui să arate așa.

# "package.json " nume ":" node-todo-api "," versiune " start ":" nod server / server.js "," test ":" export NODE_ENV = test || SET \ "NODE_ENV = test \" && server micha / ** / * test.js " : "nodemon -exec" npm test "", "motoare": "node": "8.0.0", "keywords" , "dependență": "corp-parser": "^ 1.17.2", "expres": "4.15.3", "lodash": "4.17.4" "," mongoose ":" ^ 4.11.1 "," devDependencies ": " așteptați ":" ^ 1.20.2 "," mocha ":" ^ 3.4.2 "," nodemon " "," supertest ":" ^ 3.0.0 "

Acum executați comanda pentru a instala dependențele.

npm install

Testul de solicitare POST

Pentru testul dvs., creați un nou dosar numit Test; acest dosar ar trebui să fie în Server director. Acum creați un nou fișier în care veți scrie testul. Denumiți fișierul server.test.js.

În acest fișier, începeți prin a solicita modulele instalate. De asemenea, trebuie să solicitați fișierul dvs. de server și modelul dvs..

# server / test / server.test.js const așteptați = solicitați ('așteptați') const request = solicitați ('supertest') const ObjectId = necesită ('mongodb') const app = require / server ') const Todo = necesită (' ./ ... / models / todo ')

Trebuie să aveți câteva dos-uri care vor fi folosite în timpul testelor. Dar aceste dos-uri vor fi șterse din baza de date de testare de fiecare dată când executați suita de testare. Pentru a rezolva asta, creați două teste ca asta.

# server / test / server.test.js const todos = [_id: nou ObjectId (), text: "Primul test todo", _id: new ObjectId ()), apoi (() => returnați Todo.insertMany (todos)), apoi (() => done ()) )

Blocul anterior vă curăță baza de date Todo, apoi introduce setul de documente de mai sus. Acest lucru vă asigură că aveți o cantitate stabilă de intrări în baza de date, astfel încât testele dvs. să nu se confrunte cu probleme.

Odată ce ați făcut, puteți scrie testul pentru POST cerere. Pentru tine POST cereți, veți scrie două teste. Primul va face o cerere pentru un lucru valid și va avea succes. Cel de-al doilea va face o cerere cu un organism nevalid, iar acest lucru nu ar trebui să creeze un nou obiectiv.

Iată ce ar trebui să arate testul.

# server / test / server.test.js descriu ('POST / todos', () => // 1 it ('ar trebui să creeze un nou todo', (done) => / / Todos ') .send (text) .expect (200) .expect ((res) => așteptare (res.body.text) .toBe ( text) .end ((err, res) => // 4 dacă (err) returnat făcut (err) Todo.find (text (todos.length) .toBe (1) așteptați (todos [0] .text) .toBe (text) done ()) captura (e) nu se creează todo cu date nevalide ale corpului ", (făcut) => // 6 cerere (app) // 7 .post ('/ todos') .send () .expect (400) .end ((err, res () => if (err) întoarcere făcut (err) Todo.find () și apoi ((todos) => // 8 așteptați (todos.length) toBe (2) done. captură ((e) => făcut (e)))))

Rulați testul folosind comanda:

npm test de rulare

Ar trebui să eșueze. Iată ce se întâmplă:

  1. Descrie testul.
  2. Creează un nou set de sarcini și îl salvează ca o valoare pentru text.
  3. Faceți o solicitare POST la / Todos calea API-ului dvs., trimiterea cadrului de lucru pe care l-ați creat ca organism al cererii. Vă așteptați ca codul de stare pentru solicitare să fie 200 și corpul de a-face pentru a egala valoarea de text.
  4. O eroare este returnată dacă există, iar aceasta va determina încheierea cererii. Astfel, următorul bloc de cod nu va fi rulat. Dacă nu se întâlnește nicio eroare, fluxul continuă.
  5. Se face o cerere în baza de date pentru a găsi creația de rezolvat. Veți aștepta ca lungimea to-dos din baza de date să fie 1, iar textul de rezolvat să fie egal cu valoarea textului.
  6. Acesta este testul efectuat cu date despre corpul nevalid.
  7. A POST se face o cerere către / Todos cale. De data aceasta, trimiteți o cerere fără corp. Așteptăm să obțineți a 400 cerere. Nu este nevoie să verificați corpul deoarece nu trimiteți nimic. Dacă se întâlnește o eroare, aceasta se întoarce și codul se oprește.
  8. Dacă nu se întâlnește nicio eroare, se face o cerere în baza de date pentru a verifica lungimea dosarului. Ne așteptăm ca baza de date să conțină numai 2, care sunt to-dos create la început.

Pentru a trece acest test, mergeți la dvs. server.js fișier și introduceți codul necesar pentru solicitarea POST.

# server.js app.post ('/ todos', (req, res) => let todo = nou Todo (text: req.body.text) todo.save => res.send (doc), (e) => res.status (400) .send (e))

GET Test de solicitare

Acest lucru este simplu - testul ar trebui să returneze lungimea de la dos disponibilă în baza de date. După cum știți deja, lungimea todos ar trebui să fie 2. De ce? Ai ghicit bine. La începutul suitei de testare, ați creat un beforeEach bloc care curăță baza de date și introduce noi dos-uri de fiecare dată când se execută suita de testare.

Pentru a testa că cererea de a obține toate lucrările la-dos, aici este codul pentru asta.

# server / test / server.test.js descrie ('GET / todos', () => it (' .expect (200) .expect ((res) => așteptați (res.body.todos.length) .toBe (2)) .end (done)))

În cele de mai sus, faci a OBȚINE cererea către / Todos cale. De data aceasta, nu treceți nimic ca corp al cererii deoarece este a OBȚINE cerere. Veți aștepta să primiți un răspuns cu codul de stare al lui 200. Apoi, vă așteptați ca lungimea lui to-dos să fie de 2.

Când executați testul, ar trebui să primiți o eroare. Încercați să obțineți eroarea pentru a trece pe cont propriu.

Pun pariu că ai reușit să lucrezi. Iată codul pentru a trece testul; comparați-o cu soluția dvs..

# server.js app.get ('/ todos', (req, res) => Todo.find (), apoi ((todos) => res.send (todos), => res.status (400) .send (e)))

Când un OBȚINE se face o cerere către / Todos cale, vrei să găsești fiecare lucru de făcut în colecția Todo și să-i returgi ca pe dos. Adăugați acest lucru la server.js determină trecerea testului.

Apoi, veți scrie trei teste pentru OBȚINE cererea de recuperare a dosarelor individuale. Primul ar trebui să recupereze și să returneze sarcina de lucru. Al doilea și al treilea ar trebui să revină 404 eroare în cazurile în care acest lucru nu este găsit.

Deschide-ți server.test.js și să creați un nou bloc de descriere cu primul caz de test.

# server /test.test.js descrie ('GET / todos /: id ', () => it (ar trebui să întoarcă todo doc', (done) => $ todos [0] ._ id.toHexString () ') .expect (200) .expect ((res) => așteptare (res.body.todo.text) .toBe (todos [0]. ) .end (făcut))

Acest test face a OBȚINE solicitați să preluați primul serviciu disponibil în baza dvs. de date. Așteptăm să obțineți a 200 codul de stare și apoi verificați dacă valoarea de text a acestui task este aceeași cu cea creată.

Următorul test arată astfel.

 ("ar trebui să se întoarcă 404 dacă todo nu este găsit", (done) => let _id = cerere ObjectId ('5967989ee978311656e93a59') (app) .get ('/ todos / $ todos / _id.toHexString ') .expect (404) .end (făcut))

Aici sunteți în căutarea unei rezolvări folosind un ID care nu corespunde cu ID-ul oricăror sarcini de salvare salvate în baza dvs. de date. Testul așteaptă ca această solicitare să se întoarcă a 404 eroare.

Ultimul test este ca primul, dar puțin diferit; iată cum arată.

 ("ar trebui să returnați 404 pentru ID-urile non-obiect", (done) => let hexId = '5967989ee978311656e93a5312' (app) .get ('/ todos / $ todos / hexId'). sfarsit (facut)))

Aici, creați un invalid objectId și încercați să interogați baza de date pentru a obține o potrivire de rezolvare objectId creată. Testul așteaptă cererea de returnare a 404 eroare. 

Când executați testul, toți ar trebui să eșueze. Pentru a le face să treacă, adăugați codul de mai jos la dvs. server.js fişier.

# server / server.js app.get ('/ todos /: id', (req, res) => id id = req.params.id // 1 if (! ObjectId.isValid (id) 2 return res.status (404) .send ('ID nu este valabil') Todo.findById (id) .then (todo) => if (todo) // 3 res.status retur (404) ()) res.send (todo) // 4) captură ((e) => res.status (400) .send
  1. Obțineți ID-ul solicitării de întreținere solicitate de paramani.
  2. Verificați dacă ID-ul este valabil. În cazul în care ID-ul nu este valid, se trimite o eroare în care se menționează acest lucru.
  3. Dacă ID-ul este valabil, încercați să găsiți o problemă care să corespundă acelui cod utilizând findById metodă. Dacă nu se găsește nici un obiect de activitate cu acel ID, a 404 eroare este trimis.
  4. Dacă se constată o problemă, este trimis serviciul de rezolvat. Apoi apare orice eroare care apare și o trimite.

Rulați din nou comanda de test și ar trebui să treacă.

DELETE Test de solicitare

Testul pentru dvs. ȘTERGE cererea va fi un pic similar cu ceea ce aveți pentru solicitarea GET.

În primul rând, doriți să testați că este șters un set de sarcini.

# server / test / server.test.js descrie ('DELETE / todos /: id', () => it .exe (200) .expect ((res) => expect (res.body.todo._id) .toBe ()); .end ((err, res) => // 2 dacă (err) returnul făcut (err)) Todo.findById (hexId) .then ((todo) =>  așteptați (todo.hexId) .toNotExist () done ()) captura ((e) => făcut (e)))

Iată ce se întâmplă mai sus:

  1. Ați setat id-ul de rezolvat la o variabilă numită hexid. Apoi, a ȘTERGE se face o cerere în calea acestui task, folosind ID-ul. Așteptăm să obțineți a 200 raspuns, si to-do obtinut pentru a se potrivi cu valoarea de hexid.
  2. Dacă se întâlnește o eroare, aceasta este returnată.
  3. Dacă nu există nici o eroare, testul merge mai departe la interogarea bazei dvs. de date folosind ID-ul salvat ca valoare hexid. Din moment ce a ȘTERGE cererea a fost trimisă anterior, testul se așteaptă ca potrivirea de rezolvat cu acel cod să nu existe.

În continuare, doriți să testați că atunci când se face o solicitare de ștergere a unui task care nu există, răspunsul conține o 404 eroare. Este important să aveți acest lucru, deoarece nu este posibil să ștergeți o problemă de două ori. Iată cum trebuie să pară încercarea pentru acest lucru.

# server / test / server.test.js aceasta ('ar trebui să returneze 404 dacă todo nu a fost găsit', (done) => let hexId = new ObjectId () request toHexString / $ todos / hexId ') .expect (404) .end (făcut))

Aceasta creează un ID pentru un task care nu există în baza de date. Apoi o ȘTERGE se face o cerere pentru a șterge sarcina de rezolvat. Se așteaptă ca testul să revină a 404 eroare, deoarece această problemă nu există.

Vrei să testezi asta a ȘTERGE utilizând un ID nevalid returnează a 404 eroare, ca atare.

# server / test / server.test.js it ('ar trebui să returneze 404 pentru ID-uri fără obiect', (done) => request (app) .delete ('/ todos / 123abc' (Terminat) ) )

Pentru a trece testul, deschideți server.js și renunțați la acesta.

# server.js app.delete ('/ todos /: id', (req, res) => let id = req.params.id dacă (! ObjectId.isValid (id) 404) .send () Todo.findByIdAndRemove (id) .then ((todo) => if (todo) return res.status (404) .send .catch ((e) => res.status (400) .send ())

Rulați comanda pentru a testa:

npm test de rulare

Testele ar trebui să treacă.

Concluzie

În acest moment, acum știți cum să configurați o suită de test atunci când construiți un API folosind Node.js. Ați folosit Mocha, Expect și Supertest pentru a testa un API. Un avantaj de a face acest lucru este că nu este necesar să declanșezi întotdeauna poșta de scris când îți construiești API-ul. Cu ajutorul testului, puteți afla ce este rupt.

Înainte de a ne încheia, rețineți că JavaScript a devenit una dintre limbile de facto de lucru pe web. Nu este fără curbele sale de învățare, și există o mulțime de cadre și biblioteci pentru a vă menține ocupați. Dacă sunteți în căutarea unor resurse suplimentare pentru a studia sau a utiliza în munca dvs., verificați ce avem disponibil pe Envato Market.

Folosind ceea ce știi acum, ești bine să explori lumea testării.

Cod