Testiranje, iako može biti dugotrajno, važan je korak u razvojnom ciklusu svake aplikacije. Osigurava da rano otkrijete pogreške i probleme prije nego što gurnete kod u proizvodnju.

Možete koristiti Jest za testiranje Express Rest API-ja. Nakon što ste izradili jednostavan CRUD API, otkrijte kako napisati testove za svaku krajnju točku.

Što je Jest?

Postoji mnogo biblioteka za testiranje JavaScripta koje možete izabrati, ali šala je najlakše za početak. To je biblioteka za testiranje koju je razvio Facebook, a koja se uglavnom koristi za testiranje React projekata. Međutim, možete ga koristiti i za testiranje Nodea i drugih projekata temeljenih na JavaScriptu. Razvijen je na temelju Jasmina, još jednog alata za testiranje, i dolazi u paketu s vlastitom bibliotekom tvrdnji.

Iako vam neće trebati biblioteka tvrdnji za pisanje testova u Jestu, morat ćete koristiti alat za izradu HTTP zahtjeva. Ovaj članak koristi SuperTest.

Što je SuperTest?

SuperTest je biblioteka za testiranje čvorova za HTTP pozive. Proširuje biblioteku testiranja superagenata i omogućuje vam postavljanje zahtjeva poput GET, POST, PUT i DELETE.

instagram viewer

SuperTest nudi objekt zahtjeva koji možete koristiti za upućivanje HTTP zahtjeva.

konst zahtjev = zahtijevati("supertest")
zahtjev("https://icanhazdadjoke.com")
.dobiti('/slack')
.kraj(funkcija(pogriješiti, res) {
ako (greška) bacanje griješiti;
konzola.log(res.tijelo.prilozi);
});

Ovdje prosljeđujete osnovni URL API-ja objektu zahtjeva, a zatim povezujete HTTP metodu s ostatkom URL-a. The kraj() metoda poziva API poslužitelj i funkcija povratnog poziva obrađuje njegov odgovor.

Nakon što dobijete odgovor od API-ja, možete koristiti Jest da ga potvrdite.

Stvorite Express API

Da biste testirali vlastite API krajnje točke, morate stvoriti REST API prvi. API koji ćete izraditi vrlo je jednostavan. Umeće, dohvaća, ažurira i briše stavke iz niza.

Započnite stvaranjem novog direktorija pod nazivom node-jest i inicijaliziranjem npm-a.

mkdir čvor-jest
npm init -y

Zatim stvorite novu datoteku pod nazivom index.js i kreirajte Express poslužitelj.

konst izraziti = zahtijevati("izraziti")
konst app = express()
app.listen (3000, () => console.log("Slušanje na portu 3000"))

Testirajte krajnju točku GET /todos

Prva krajnja točka koju ćete stvoriti je krajnja točka GET /todos. Vraća sve stavke u nizu. U index.js dodajte sljedeće.

konst todos = [
];
// Dobiti sve zadatke
app.get("/todos", (req, res) => {
povratakres.status(200).json({
podaci: todos,
greška: ništavan,
});
});

Imajte na umu da odgovor ima statusni kod 200 i JSON objekt koji sadrži stavku obaveza u nizu pod nazivom podaci i poruku o pogrešci. To je ono što ćete testirati koristeći Jest.

Sada instalirajte Jest i SuperTest:

npm instalirati šala supertest

Zatim dodajte testnu skriptu paket.json kako slijedi:

{
"skripte": {
"test": "šala"
}
}

Prije nego počnete pisati vlastite testove, trebali biste razumjeti kako napisati osnovni test u Jestu.

Razmotrite sljedeću funkciju:

funkcijaiznos(a, b) {
povratak a + b;
}
modul.izvozi = zbroj;

U testnoj datoteci trebate:

  • Uvezite funkciju.
  • Opišite što test treba učiniti.
  • Pozovite funkciju.
  • Potvrdite očekivani odgovor stvarnim odgovorom funkcije.
konst {zbroj} = zahtijevati("./iznos")
opisati("Zbroj dviju stavki", async() => {
test("Trebalo bi vratiti 4", () => {
očekivati(iznos(2,2)).biti(4)
})
})

The opisati ključna riječ određuje grupu testova i test izjava specificira određeni test. Ako vrijednost vraćena iz funkcije odgovara vrijednosti proslijeđenoj biti, test prolazi.

Prilikom testiranja krajnjih točaka API-ja, nećete pozivati ​​funkciju, već slati zahtjev koristeći SuperTest ili drugu HTTP klijentsku biblioteku.

Vraćajući se na GET krajnju točku, stvorite novu datoteku pod nazivom api.test.js. Ovdje ćete napisati sve testove krajnjih točaka. Imenovanje testne datoteke s a .test infix osigurava da je Jest prepozna kao testnu datoteku.

U api.test.js uvezite supertest i postavite osnovni URL ovako:

konst zahtjev = zahtijevati("supertest")
konst baseURL = "http://localhost: 3000"

Zatim izradite prvi test u bloku opisa:

opisati("DOBITI /todos", () => {
konst noviTodo = {
iskaznica: kripto.randomUUID(),
artikal: "Piti vodu",
završeno: lažno,
}
prijeSvega(asinkroni () => {
// postaviti zadatak
čekaj zahtjev (baseURL).post("/todo").send (newTodo);
})
nakon svega(asinkroni () => {
čekati zahtjev (baseURL).delete(`/todo/${newTodo.id}`)
})
to("treba vratiti 200", asinkroni () => {
konst odgovor = čekati zahtjev (baseURL).get("/todos");
očekivati(odgovor.statusCode).biti(200);
očekivati(odgovor.tijelo.pogreška).biti(ništavan);
});
to("treba vratiti todos", asinkroni () => {
konst odgovor = čekati zahtjev (baseURL).get("/todos");
očekuj (response.body.data.length >= 1).biti(pravi);
});
});

Prije pokretanja testova morat ćete definirati funkcije postavljanja i rastavljanja. Ove će funkcije popuniti niz zadataka stavkom prije testa i izbrisati lažne podatke nakon svakog testa.

Kod koji se izvodi prije svih testova nalazi se u funkciji beforeAll(). Kod koji se pokreće nakon svih testova nalazi se u funkciji afterAll().

U ovom primjeru jednostavno pogađate krajnje točke POST i DELETE za svaku. U stvarnoj aplikaciji vjerojatno biste se povezali s lažnom bazom podataka koja sadrži testne podatke.

U ovom ste testu prvo uputili zahtjev krajnjoj točki GET /todos i usporedili poslani odgovor s očekivanim rezultatima. Ovaj test će proći ako odgovor ima HTTP statusni kod od 200, podaci nisu prazni, a poruka o pogrešci je nula.

Testirajte krajnju točku POST /todo

U index.js stvorite krajnju točku POST /todo:

app.post("/todo", (req, res) => {
probati {
konst { id, item, completed } = req.body;
konst noviTodo = {
iskaznica,
artikal,
završeno,
};
todos.gurnuti(noviTodo);
povratakres.status(201).json({
podaci: todos,
greška: ništavan,
});
} ulov (pogreška) {
povratakres.status(500).json({
podaci: ništavan,
greška: greška,
});
}
});

U ovom testu morat ćete poslati pojedinosti o obvezama u tijelu zahtjeva pomoću metode send().

zahtjev (osnovniURL).post("/todo").send (noviTodo)

Zahtjev POST /todo trebao bi vratiti statusni kod 201 i polje todos s novom stavkom dodanom na kraju. Evo kako bi test mogao izgledati:

opisati("POST /todo", () => {
konst noviTodo = {
// napraviti
}
nakon svega(asinkroni () => {
čekati zahtjev (baseURL).delete(`/todo/${newTodo.id}`)
})
to("treba dodati stavku u niz todos", asinkroni () => {
konst odgovor = čekati zahtjev (osnovniURL).post("/todo").send(newTodo);
konst lastItem = response.body.data[response.body.data.length-1]
očekivati(odgovor.statusCode).biti(201);
očekivati(posljednja stavka.artikal).biti(noviTodo["artikal"]);
očekivati(posljednja stavka.dovršen).biti(noviTodo["dovršeno"]);
});
});

Ovdje prosljeđujete todo podatke metodi send() kao argument. Odgovor bi trebao imati statusni kod 201 i također sadržavati sve stavke obaveza u podatkovnom objektu. Da biste provjerili je li todo doista stvoren, provjerite odgovara li posljednji unos u vraćenim todosima onima koje ste poslali u zahtjevu.

Krajnja točka PUT /todos/:id trebala bi vratiti ažuriranu stavku:

app.put("/todos/:id", (req, res) => {
probati {
konst id = req.params.id
konst todo = todos.find((todo) => todo.id == id);
if(!todo) {
bacanjenoviGreška("Zadatak nije pronađen")
}
todo.completed = req.body.completed;
povratakres.status(201).json({
podaci: todo,
greška: ništavan,
});
} ulov (pogreška) {
povratakres.status(500).json({
podaci: ništavan,
greška: greška,
});
}
});

Testirajte odgovor na sljedeći način:

opisati("Ažurirajte jednu obavezu", () => {
konst noviTodo = {
// napraviti
}
prijeSvega(asinkroni () => {
čekaj zahtjev (baseURL).post("/todo").send (newTodo);
})
nakon svega(asinkroni () => {
čekati zahtjev (baseURL).delete(`/todo/${newTodo.id}`)
})
to("treba ažurirati stavku ako postoji", asinkroni () => {
konst odgovor = čekati zahtjev (osnovniURL).put(`/todos/${newTodo.id}`).poslati({
završeno: pravi,
});
očekivati(odgovor.statusCode).biti(201);
očekivati(odgovor.tijelo.podaci.dovršen).biti(pravi);
});
});

Dovršena vrijednost u tijelu odgovora trebala bi biti istinita. Ne zaboravite uključiti ID stavke koju želite ažurirati u URL.

Testirajte krajnju točku DELETE /todos/:id

U index.js kreirajte krajnju točku DELETE. Trebao bi vratiti podatke o obvezama bez izbrisane stavke.

app.delete("/todos/:id", (req, res) => {
probati {
konst id = req.params.id
konst todo = todos[0]
if (todo) {
todos.spojnica(iskaznica, 1)
}
povratakres.status(200).json({
podaci: todos,
greška: ništavan,
});
} ulov (pogreška) {
povratakres.status(500).json({
podaci: ništavan,
greška: greška,
});
}
});

Da biste testirali krajnju točku, možete provjeriti postoji li izbrisana stavka i dalje u vraćenim podacima:

opisati("Izbriši jednu obavezu", () => {
konst noviTodo = {
// napraviti
}
prijeSvega(asinkroni () => {
čekaj zahtjev (baseURL).post("/todo").send (newTodo);
})
to("treba izbrisati jednu stavku", asinkroni () => {
konst odgovor = čekati zahtjev (baseURL).delete(`/todos/${newTodo.id}`);
konst todos = odgovor.tijelo.podaci
konst postoji = todos.find (todo => {
newTodo.id == todoId
})
očekivati ​​(postoji).toBe(nedefiniran)
});
});

Podaci koje vraća krajnja točka DELETE ne bi trebali sadržavati izbrisanu stavku. Budući da su vraćene stavke u nizu, možete koristiti Array[id] da provjerite je li API ispravno izbrisao stavku. Rezultat bi trebao biti lažan.

Stvaranje REST API-ja

U ovom ste članku naučili kako testirati Express Rest API pomoću Jest API-ja. Napisali ste testove za GET, PUT, POST i DELETE HTTP zahtjeve i vidjeli kako poslati podatke krajnjoj točki u URL-u i zahtjevu. Trebali biste moći primijeniti ovo znanje prilikom testiranja vlastitog Rest API-ja.