Testiranje modelov Mongoose je lahko izziv, ker morate napisati teste, ki ne posegajo v vašo dejansko bazo podatkov. Paket pomnilniškega strežnika MongoDB ponuja preprosto rešitev. Omogoča vam shranjevanje testnih podatkov v pomnilnik aplikacije.

V tej vadnici boste ustvarili preprost model Mongoose in pisali teste z uporabo Jesta in pomnilniškega strežnika MongoDB.

Kaj je pomnilniški strežnik MongoDB?

Zadnja stvar, ki si jo želite, je shranjevanje lažnih podatkov v vaši pravi bazi podatkov, kar se lahko zgodi, če se nanjo povežete med testiranjem. Namesto tega se lahko odločite za uporabo ločenega lokalnega primerka MongoDB za shranjevanje vaših podatkov. Čeprav to deluje, je neizvedljivo, če se vaši testi izvajajo v oblaku. Poleg tega je povezovanje in poizvedovanje po pravi bazi podatkov med vsakim preizkusom lahko drago.

Pomnilniški strežnik MongoDB, pa zavrti pravi strežnik MongoDB in vam omogoča shranjevanje testnih podatkov v pomnilnik. Zaradi tega je hitrejši kot uporaba lokalne baze podatkov MongoDB, saj podatki niso zapisani na fizični disk.

instagram viewer

Ustvarjanje modela Mongoose

Modeli Mongoose zagotavljajo vmesnik za povezovanje z bazo podatkov MongoDB. Če jih želite ustvariti, jih morate prevesti iz sheme Mongoose, ki definira vaš podatkovni model MongoDB. V tej vadnici bo uporabljena shema za dokument opravila. Vseboval bo naslov in izpolnjena polja.

Zaženite naslednji ukaz v terminalu, da ustvarite novo mapo in se pomaknete do nje.

mkdir mongoose-model-test
cd mungos-model-test

Inicializirajte npm z naslednjim ukazom:

npm init -y

The -y zastavica naroči npm, naj ustvari datoteko package.json s privzetimi vrednostmi.

Izvedite ta ukaz, da namestite mungos paket:

npm namestite mungos

Ustvari novo datoteko z imenom todo.model.js in definirajte shemo opravil:

konst mungos = zahtevati("mungos")
konst {Shema} = mungos
konst TodoSchema = novo Shema({
element: {
vrsta: Vrvica,
obvezno: prav
},
dokončano: {
vrsta: Boolean,
obvezno: prav
}
})

Na koncu te datoteke ustvarite in izvozite model opravil:

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

Načrtovanje testov

Ko pišete teste, želite vnaprej načrtovati, kaj boste testirali. To zagotavlja, da preizkusite vse funkcije svojega modela.

Iz modela Mongoose, ki smo ga ustvarili, mora opravilo vsebovati postavko tipa String in izpolnjeno polje tipa Boolean. Obe polji sta obvezni. To pomeni, da mora naš test zagotavljati vsaj:

  • Veljavne postavke so uspešno shranjene v bazi podatkov.
  • Elementi brez obveznih polj se ne shranijo.
  • Postavke z neveljavno vrsto polj se ne shranijo.

Te teste bomo napisali v enem testnem bloku, ker so povezani. V Jestu ta testni blok definirate z uporabo opisati funkcijo. Na primer:

opisati ('Todo Model Test', () => {
// Vaši testi so tukaj
}

Nastavitev baze podatkov

Če želite nastaviti pomnilniški strežnik MongoDB, boste ustvarili nov primerek pomnilniškega strežnika Mongo in se povezali z Mongoose. Ustvarili boste tudi funkcije, ki bodo odgovorne za izbris vseh zbirk v bazi podatkov in prekinitev povezave s primerkom pomnilniškega strežnika Mongo.

Za namestitev zaženite naslednji ukaz mongodb-pomnilniški-strežnik.

npm namestite mongodb-spomin-strežnik

Ustvari novo datoteko z imenom setuptestdb.js in uvozite mongoose in mongodb-memory-server.

konst mungos = zahtevati("mungos");
konst { MongoMemoryServer } = zahtevati("mongodb-pomnilniški-strežnik");

Nato ustvarite funkcijo connectDB(). Ta funkcija ustvari nov primerek pomnilniškega strežnika Mongo in se poveže z Mongoose. Zagnali ga boste pred vsemi testi, da se povežete s testno zbirko podatkov.

pustiti mongo = nič;

konst povežiDB = asinh () => {
mongo = čakati MongoMemoryServer.create();
konst uri = mongo.getUri();

čakati mongoose.connect (uri, {
useNewUrlParser: prav,
useUnifiedTopology: prav,
});
};

Ustvarite funkcijo dropDB() tako, da dodate naslednjo kodo. Ta funkcija izbriše bazo podatkov, zapre povezavo Mongoose in ustavi primerek pomnilniškega strežnika Mongo. To funkcijo boste zagnali, ko bodo vsi testi končani.

konst dropDB = asinh () => {
če (mongo) {
čakatimungos.povezava.dropDatabase();
čakatimungos.povezava.zapri();
čakati mongo.stop();
}
};

Zadnja funkcija, ki jo boste ustvarili, se imenuje dropCollections(). Izpusti vse ustvarjene zbirke Mongoose. Zagnali ga boste po vsakem testu.

konst dropCollections = asinh () => {
če (mongo) {
konst zbirke = čakati mongoose.connection.db.collections();
za (pustiti zbirka od zbirke) {
čakati zbirka.odstrani();
}
}
};

Končno izvozite funkcije conenctDB(), dropDB() in dropCollections().

modul.izvoz = {connectDB, dropDB, dropCollections}

Pisanje testov

Kot že omenjeno, boste za pisanje testov uporabili Jest. Zaženite naslednji ukaz za namestitev jest.

npm namestite šala

V package.json datoteko, konfigurirajte jest. Zamenjajte obstoječi blok "skripti" z naslednjim:

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

Ustvari novo datoteko z imenom todo.model.test.js in uvozite knjižnico mongoose, model opravil in funkcije conenctDB(), dropDB() in dropCollections():

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

Pred izvedbo vseh testov morate zagnati funkcijo connectDB(). Pri Jestu lahko uporabite metodo beforeAll().

Zagnati morate tudi funkcije čiščenja. Po vsakem preizkusu zaženite funkcijo dropCollections() in dropDB() po vseh testih. Tega vam ni treba narediti ročno in lahko uporabite metodi afterEach() in afterAll() iz Jesta.

Dodajte naslednjo kodo v datoteko todo.model.test.js, da nastavite in počistite bazo podatkov.

pred Vsem(asinh () => {
čakati povežiDB();
});

konec koncev(asinh () => {
čakati dropDB();
});

afterEach(asinh () => {
čakati dropCollections();
});

Zdaj ste pripravljeni na ustvarjanje testov.

Prvi test bo preveril, ali je bila postavka opravila uspešno vstavljena v bazo podatkov. Preveril bo, ali je ID objekta prisoten v ustvarjenem in ali se podatki v njem ujemajo s tistimi, ki ste jih poslali v bazo podatkov.

Ustvarite opisni blok in dodajte naslednjo kodo.

opisati ("Todo Model", () => {
to("mora uspešno ustvariti element opravila", async () => {
pustiti validTodo = {
predmet: "Pomij posodo",
dokončano: lažno,
};
konst novoOpravilo = čakati Todo (validTodo);
čakati newTodo.save();
pričakovati(novoTodo._id).toBeDefined();
pričakovati(novoTodo.predmet).biti(validTodo.predmet);
pričakovati(novoTodo.dokončano).biti(validTodo.dokončano);
});
});

to ustvari nov dokument v bazi podatkov ki vsebuje podatke v spremenljivki validTodo. Vrnjeni objekt se nato preveri glede na pričakovane vrednosti. Da bi bil ta preizkus uspešen, mora vrnjena vrednost imeti ID objekta. Poleg tega se morajo vrednosti v poljih item in completed ujemati s tistimi v objektu validTodo.

Poleg testiranja običajnega primera uporabe morate preizkusiti tudi neuspeli primer uporabe. Iz testov, ki smo jih načrtovali, morate preizkusiti model mongoose z objektom opravila z manjkajočim zahtevanim poljem in enim z nepravilnim tipom.

Dodajte drugi test v isti opisni blok, kot sledi:

 to("za element opravila brez zahtevanih polj ne bi smelo uspeti", async () => {
pustiti invalidTodo = {
predmet: "Pomij posodo",
};
poskusi {
konst novoOpravilo = novo Todo (invalidTodo);
čakati newTodo.save();
} ulov (napaka) {
pričakovati(napaka).toBeInstanceOf(mungos.Napaka.ValidationError);
pričakovati(napaka.napake.dokončano).toBeDefined();
}
});

Model Todo mongoose pričakuje tako element kot izpolnjena polja. Če poskušate shraniti opravilo brez enega od teh polj, bi moralo sprožiti napako. Ta preizkus uporablja blok try…catch za prestrezanje vržene napake. Preizkus pričakuje, da so napake napaka preverjanja veljavnosti mongoose in izhajajo iz manjkajočega izpolnjenega polja.

Če želite preizkusiti, ali model vrže napako, če uporabljate vrednosti napačne vrste, dodajte naslednjo kodo v blok opisa.

 to("ne bi smelo uspeti za element opravila s polji napačne vrste", async () => {
pustiti invalidTodo = {
predmet: "Pomij posodo",
dokončano: "False"
};
poskusi {
konst novoOpravilo = novo Todo (invalidTodo);
čakati newTodo.save();
} ulov (napaka) {
pričakovati(napaka).toBeInstanceOf(mungos.Napaka.ValidationError);
pričakovati(napaka.napake.dokončano).toBeDefined();
}
});

Upoštevajte, da je vrednost izpolnjenega polja niz namesto logične vrednosti. Preizkus pričakuje, da bo vržena napaka pri preverjanju, saj model pričakuje logično vrednost.

MongoMemoryServer in Jest sta odlična ekipa

Paket mongo-memory-server npm zagotavlja enostavno rešitev za testiranje modelov Mongoose. Navidezne podatke lahko shranite v pomnilnik, ne da bi se dotaknili baze podatkov vaše aplikacije.

Za pisanje testov za modele Mongoose lahko uporabite MongoMemoryServer z Jest. Upoštevajte, da ne zajema vseh možnih testov, ki jih lahko napišete za svoje modele. Ti testi bodo odvisni od vaše sheme.