Može biti izazov testirati Mongoose modele jer trebate napisati testove koji ne ometaju vašu stvarnu bazu podataka. Paket MongoDB memorijskog poslužitelja nudi jednostavno rješenje. Omogućuje vam pohranjivanje podataka o ispitivanju u memoriju aplikacije.

U ovom ćete vodiču izraditi jednostavan Mongoose model i napisati testove koristeći Jest i MongoDB memorijski poslužitelj.

Što je MongoDB memorijski poslužitelj?

Zadnje što želite je spremiti lažne podatke u svoju pravu bazu podataka, što bi se moglo dogoditi ako se na nju povežete tijekom testiranja. Umjesto toga, možete odabrati korištenje zasebne lokalne MongoDB instance za pohranjivanje podataka. Iako ovo funkcionira, neizvedivo je ako se vaši testovi izvode u oblaku. Štoviše, povezivanje i postavljanje upita stvarnoj bazi podataka tijekom svakog testa može biti skupo.

MongoDB memorijski poslužitelj, međutim, pokreće pravi MongoDB poslužitelj i omogućuje vam pohranu testnih podataka u memoriju. To ga čini bržim od korištenja lokalne MongoDB baze podataka budući da se podaci ne zapisuju na fizički disk.

instagram viewer

Stvaranje Mongoose modela

Mongoose modeli pružaju sučelje za povezivanje s MongoDB bazom podataka. Da biste ih stvorili, trebate ih kompajlirati iz Mongoose sheme, koji definira vaš MongoDB model podataka. Ovaj vodič koristit će shemu za dokument sa zadacima. Sadržat će naslov i popunjena polja.

Pokrenite sljedeću naredbu u terminalu za stvaranje nove mape i dođite do nje.

mkdir mungos-model-test
CD mungos-model-test

Inicijalizirajte npm sljedećom naredbom:

npm init -y

The -y zastavica upućuje npm da generira datoteku package.json sa zadanim vrijednostima.

Izvršite ovu naredbu za instalaciju mungos paket:

npm instalirati mungos

Napravite novu datoteku pod nazivom todo.model.js i definirajte shemu zadataka:

konst mungos = zahtijevati("mungos")
konst {Shema} = mungos
konst TodoSchema = novi Shema({
stavka: {
tip: Niz,
potreban: pravi
},
završeno: {
tip: Booleov,
potreban: pravi
}
})

Na kraju ove datoteke izradite i izvezite model zadataka:

modul.izvozi = mongoose.model("Todo", TodoSchema)

Planiranje testova

Kada pišete testove, želite unaprijed isplanirati što ćete testirati. To osigurava testiranje svih funkcionalnosti vašeg modela.

Iz Mongoose modela koji smo stvorili, todo treba sadržavati stavku tipa String i ispunjeno polje tipa Boolean. Oba ova polja su obavezna. To znači da bi naš test barem trebao osigurati:

  • Važeće stavke su uspješno spremljene u bazu podataka.
  • Stavke bez obaveznih polja se ne spremaju.
  • Stavke s poljima nevažeće vrste nisu spremljene.

Ove ćemo testove napisati u jednom testnom bloku jer su povezani. U Jestu ovaj testni blok definirate pomoću opisati funkcija. Na primjer:

opisati('Todo Model Test', () => {
// Vaši testovi idu ovdje
}

Postavljanje baze podataka

Da biste postavili MongoDB memorijski poslužitelj, stvorit ćete novu instancu Mongo memorijskog poslužitelja i spojiti se na Mongoose. Također ćete stvoriti funkcije koje će biti odgovorne za ispuštanje svih kolekcija u bazi podataka i odspajanje od instance Mongo memorijskog poslužitelja.

Pokrenite sljedeću naredbu za instalaciju mongodb-memorijski-poslužitelj.

npm instalirati mongodb-memorija-poslužitelj

Napravite novu datoteku pod nazivom setuptestdb.js i uvesti mongoose i mongodb-memory-server.

konst mungos = zahtijevati("mungos");
konst { MongoMemoryServer } = zahtijevati("mongodb-memorijski-poslužitelj");

Zatim izradite funkciju connectDB(). Ova funkcija stvara novu instancu Mongo memorijskog poslužitelja i povezuje se s Mongooseom. Pokrenut ćete ga prije svih testova da biste se povezali s testnom bazom podataka.

neka mongo = ništavan;

konst povezivanjeDB = asinkroni () => {
mongo = čekati MongoMemoryServer.create();
konst uri = mongo.getUri();

čekati mongoose.connect (uri, {
useNewUrlParser: pravi,
useUnifiedTopology: pravi,
});
};

Stvorite funkciju dropDB() dodavanjem sljedećeg koda. Ova funkcija ispušta bazu podataka, zatvara Mongoose vezu i zaustavlja instancu Mongo memorijskog poslužitelja. Ovu ćete funkciju pokrenuti nakon završetka svih testova.

konst dropDB = asinkroni () => {
ako (mongo) {
čekatimungos.povezanost.dropBaza podataka();
čekatimungos.povezanost.Zatvoriti();
čekati mongo.stop();
}
};

Posljednja funkcija koju ćete izraditi zove se dropCollections(). Ispušta sve stvorene Mongoose kolekcije. Pokrenut ćete ga nakon svakog testa.

konst dropCollections = asinkroni () => {
ako (mongo) {
konst zbirke = čekati mongoose.connection.db.collections();
za (neka kolekcija od zbirke) {
čekati zbirka.ukloni();
}
}
};

Na kraju, izvezite funkcije conenctDB(), dropDB() i dropCollections().

modul.izvozi = {connectDB, dropDB, dropCollections}

Pisanje testova

Kao što je spomenuto, koristit ćete Jest za pisanje testova. Pokrenite sljedeću naredbu za instalaciju jest.

npm instalirati šala

u paket.json datoteku, konfigurirati jest. Zamijenite postojeći blok "skripti" sljedećim:

"skripte": {
"test": "jest --runInBand --detectOpenHandles"
},
"šala": {
"testEnvironment": "čvor"
},

Napravite novu datoteku pod nazivom todo.model.test.js i uvesti biblioteku mongoose, model todo i funkcije conenctDB(), dropDB() i dropCollections():

konst mungos = zahtijevati("mungos");
konst {connectDB, dropDB, dropCollections} = zahtijevati("./setupdb");
konst Todo = zahtijevati("./todo.model");

Morate pokrenuti funkciju connectDB() prije pokretanja svih testova. Uz Jest, možete koristiti metodu beforeAll().

Također morate pokrenuti funkcije čišćenja. Nakon svakog testa pokrenite funkciju dropCollections() i funkciju dropDB() nakon svih testova. Ne morate to raditi ručno i možete koristiti metode afterEach() i afterAll() iz Jesta.

Dodajte sljedeći kod u datoteku todo.model.test.js za postavljanje i čišćenje baze podataka.

prijeSvega(asinkroni () => {
čekati povezivanjeDB();
});

nakon svega(asinkroni () => {
čekati dropDB();
});

nakonSvakog(asinkroni () => {
čekati dropCollections();
});

Sada ste spremni za izradu testova.

Prvim testom provjerit će se je li todo stavka uspješno umetnuta u bazu podataka. Provjerit će je li Id objekta prisutan u kreiranoj i odgovaraju li podaci u njoj onima koje ste poslali u bazu podataka.

Napravite blok opisa i dodajte sljedeći kod.

opisati("Todo model", () => {
to("trebao bi uspješno stvoriti stavku obveze", asinkroni () => {
neka validTodo = {
artikal: "Operi suđe",
završeno: lažno,
};
konst noviTodo = čekati Todo (validTodo);
čekati newTodo.save();
očekivati(noviTodo._iskaznica).toBeDefined();
očekivati(noviTodo.artikal).biti(validTodo.artikal);
očekivati(noviTodo.dovršen).biti(validTodo.dovršen);
});
});

Ovaj stvara novi dokument u bazi podataka koji sadrži podatke u varijabli validTodo. Vraćeni objekt se tada provjerava u odnosu na očekivane vrijednosti. Da bi ovaj test prošao, vraćena vrijednost treba imati ID objekta. Također, vrijednosti u poljima item i completed trebaju odgovarati onima u objektu validTodo.

Osim testiranja normalnog slučaja upotrebe, morate testirati i neuspješan slučaj upotrebe. Od testova koje smo planirali, trebate testirati model mongoose s objektom todo, s obaveznim poljem koje nedostaje i s netočnim tipom.

Dodajte drugi test u isti blok opisa, kako slijedi:

 to("ne bi trebao uspjeti za stavku obaveza bez potrebnih polja", asinkroni () => {
neka invalidTodo = {
artikal: "Operi suđe",
};
probati {
konst noviTodo = novi Todo (invalidTodo);
čekati newTodo.save();
} ulov (pogreška) {
očekivati(greška).toBeInstanceOf(mungos.Pogreška.ValidationError);
očekivati(greška.pogreške.dovršen).toBeDefined();
}
});

Model Todo mongoose očekuje i stavku i popunjena polja. Trebao bi izbaciti pogrešku ako pokušate spremiti todo bez jednog od ovih polja. Ovaj test koristi blok try…catch za hvatanje bačene pogreške. Test očekuje da su pogreške pogreška provjere valjanosti mongoosea i da potječu od nepopunjenog polja.

Da biste testirali daje li model pogrešku ako koristite vrijednosti pogrešne vrste, dodajte sljedeći kod u blok opisa.

 to("trebalo bi propasti za stavku obaveza s poljima pogrešnog tipa", asinkroni () => {
neka invalidTodo = {
artikal: "Operi suđe",
završeno: "lažno"
};
probati {
konst noviTodo = novi Todo (invalidTodo);
čekati newTodo.save();
} ulov (pogreška) {
očekivati(greška).toBeInstanceOf(mungos.Pogreška.ValidationError);
očekivati(greška.pogreške.dovršen).toBeDefined();
}
});

Imajte na umu da je vrijednost dovršenog polja niz umjesto booleove vrijednosti. Test očekuje da će se pojaviti pogreška provjere jer model očekuje Booleovu vrijednost.

MongoMemoryServer i Jest čine sjajan tim

Mongo-memory-server npm paket pruža jednostavno rješenje za testiranje Mongoose modela. Lažne podatke možete pohraniti u memoriju bez diranja baze podataka svoje aplikacije.

Možete koristiti MongoMemoryServer s Jestom za pisanje testova za Mongoose modele. Imajte na umu da ne pokriva sve moguće testove koje možete napisati za svoje modele. Ti testovi će ovisiti o vašoj shemi.