Tas var būt izaicinājums pārbaudīt Mongoose modeļus, jo jums ir jāraksta testi, kas netraucē jūsu faktisko datubāzi. MongoDB atmiņas servera pakotne piedāvā vienkāršu risinājumu. Tas ļauj saglabāt testa datus lietojumprogrammas atmiņā.

Šajā apmācībā jūs izveidosit vienkāršu Mongoose modeli un rakstīsit testus, izmantojot Jest un MongoDB atmiņas serveri.

Kas ir MongoDB atmiņas serveris?

Pēdējā lieta, ko vēlaties, ir saglabāt viltotus datus reālajā datu bāzē, kas varētu notikt, ja testēšanas laikā izveidosit savienojumu ar to. Tā vietā varat izvēlēties izmantot atsevišķu vietējo MongoDB instanci savu datu glabāšanai. Lai gan tas darbojas, tas nav iespējams, ja jūsu testi tiek veikti mākonī. Turklāt reālas datu bāzes savienošana un vaicājumu veikšana katra testa laikā var kļūt dārga.

MongoDB atmiņas serveristomēr izveido īstu MongoDB serveri un ļauj saglabāt testa datus atmiņā. Tas padara to ātrāku nekā vietējās MongoDB datu bāzes izmantošana, jo dati netiek ierakstīti fiziskā diskā.

Mongoose modeļa izveide

instagram viewer

Mongoose modeļi nodrošina saskarni saskarnei ar MongoDB datu bāzi. Lai tos izveidotu, tie ir jāapkopo no Mongoose shēmas, kas nosaka jūsu MongoDB datu modeli. Šajā apmācībā tiks izmantota uzdevuma dokumenta shēma. Tajā būs nosaukums un aizpildīti lauki.

Palaidiet šo komandu terminālī, lai izveidotu jaunu mapi un pārietu uz to.

mkdir mongoose-model-test
cd mangusts-modeļa tests

Inicializējiet npm ar šādu komandu:

npm init -y

The -y karodziņš uzdod npm ģenerēt failu package.json ar noklusējuma vērtībām.

Izpildiet šo komandu, lai instalētu mangusts iepakojums:

npm uzstādīt mangusts

Izveidojiet jaunu failu ar nosaukumu todo.model.js un definējiet todo shēmu:

konst mangusts = pieprasīt("mangusts")
konst { Shēma } = mangusts
konst TodoSchema = jauns Shēma({
lieta: {
veids: Stīga,
nepieciešams: taisnība
},
pabeigts: {
veids: Būla,
nepieciešams: taisnība
}
})

Šī faila beigās izveidojiet un eksportējiet todo modeli:

modulis.eksportu = mangusts.model("Todo", TodoSchema)

Pārbaužu plānošana

Rakstot testus, vēlies iepriekš izplānot, ko pārbaudīsi. Tas nodrošina, ka tiek pārbaudīta visa modeļa funkcionalitāte.

No mūsu izveidotā modeļa Mongoose uzdevumā jāietver vienums, kura tips ir String, un aizpildīts Būla tipa lauks. Abi šie lauki ir obligāti. Tas nozīmē, ka mūsu pārbaudei ir jānodrošina vismaz:

  • Derīgie vienumi ir veiksmīgi saglabāti datu bāzē.
  • Vienumi bez obligātajiem laukiem netiek saglabāti.
  • Vienumi ar nederīga veida laukiem netiek saglabāti.

Mēs rakstīsim šos testus vienā testa blokā, jo tie ir saistīti. Programmā Jest jūs definējat šo testa bloku, izmantojot aprakstīt funkciju. Piemēram:

aprakstīt ('Todo modeļa tests', () => {
// Jūsu testi ir šeit
}

Datu bāzes iestatīšana

Lai iestatītu MongoDB atmiņas serveri, izveidojiet jaunu Mongo atmiņas servera gadījumu un izveidosiet savienojumu ar Mongoose. Jūs arī izveidosit funkcijas, kas būs atbildīgas par visu kolekciju nomešanu datu bāzē un atvienošanu no Mongo atmiņas servera instances.

Lai instalētu, palaidiet šo komandu mongodb-atmiņas serveris.

npm uzstādīt mongodb-atmiņa-serveris

Izveidojiet jaunu failu ar nosaukumu setuptestdb.js un importēt mongoose un mongodb-atmiņas serveri.

konst mangusts = pieprasīt("mangusts");
konst { MongoMemoryServer } = pieprasīt("mongodb-atmiņas-serveris");

Pēc tam izveidojiet connectDB() funkciju. Šī funkcija izveido jaunu Mongo atmiņas servera gadījumu un izveido savienojumu ar Mongoose. Jūs to palaižat pirms visiem testiem, lai izveidotu savienojumu ar testa datu bāzi.

ļaut mongo = null;

konst connectDB = asinhrons () => {
mongo = gaidīt MongoMemoryServer.create();
konst uri = mongo.getUri();

gaidīt mongoose.connect (uri, {
useNewUrlParser: taisnība,
izmantojiet vienotu topoloģiju: taisnība,
});
};

Izveidojiet funkciju dropDB(), pievienojot šādu kodu. Šī funkcija pamet datu bāzi, aizver Mongoose savienojumu un aptur Mongo atmiņas servera gadījumu. Šī funkcija tiks palaists pēc visu testu pabeigšanas.

konst dropDB = asinhrons () => {
if (mongo) {
gaidītmangusts.savienojums.dropDatabase();
gaidītmangusts.savienojums.aizvērt();
gaidīt mongo.stop();
}
};

Pēdējā izveidotā funkcija tiek saukta par dropCollections(). Tas pamet visas izveidotās Mongoose kolekcijas. Jūs to izpildīsiet pēc katras pārbaudes.

konst dropCollections = asinhrons () => {
if (mongo) {
konst kolekcijas = gaidīt mongoose.connection.db.collections();
priekš (ļaut kolekcija no kolekcijas) {
gaidīt collection.remove();
}
}
};

Visbeidzot, eksportējiet funkcijas conenctDB(), dropDB() un dropCollections().

modulis.eksportu = { connectDB, dropDB, dropCollections}

Pārbaudījumu rakstīšana

Kā minēts, testu rakstīšanai izmantosit Jest. Palaidiet šo komandu, lai instalētu jest.

npm uzstādīt joks

Iekš pack.json failu, konfigurējiet jest. Aizstājiet savu esošo "skriptu" bloku ar šādu:

"skripti": {
"pārbaude": "jest --runInBand --detectOpenHandles"
},
"joks": {
"testa Vide": "mezgls"
},

Izveidojiet jaunu failu ar nosaukumu todo.model.test.js un importējiet mongoose bibliotēku, todo modeli un conenctDB(), dropDB() un dropCollections() funkcijas:

konst mangusts = pieprasīt("mangusts");
konst { connectDB, dropDB, dropCollections } = pieprasīt(./setupdb");
konst Todo = pieprasīt(./todo.model");

Pirms visu testu palaišanas ir jāpalaiž connectDB() funkcija. Izmantojot Jest, varat izmantot metodi beforeAll().

Jums ir jāpalaiž arī tīrīšanas funkcijas. Pēc katras pārbaudes palaidiet funkciju dropCollections() un funkciju dropDB() pēc visiem testiem. Jums tas nav jādara manuāli, un varat izmantot Jest metodes afterEach() un afterAll().

Pievienojiet tālāk norādīto kodu failam todo.model.test.js, lai iestatītu un notīrītu datu bāzi.

pirms visiem(asinhrons () => {
gaidīt connectDB();
});

galu galā(asinhrons () => {
gaidīt dropDB();
});

pēc katra(asinhrons () => {
gaidīt dropCollections();
});

Tagad esat gatavs izveidot testus.

Pirmajā testā tiks pārbaudīts, vai uzdevuma vienums ir veiksmīgi ievietots datu bāzē. Tas pārbaudīs, vai objekta ID atrodas izveidotajā un vai tajā esošie dati atbilst tiem, kurus nosūtījāt datu bāzei.

Izveidojiet apraksta bloku un pievienojiet šādu kodu.

aprakstīt ("Todo modelis", () => {
tas ("vajadzētu veiksmīgi izveidot uzdevumu vienumu", asinhrons () => {
ļaut validTodo = {
lieta: "Nomazgā traukus",
pabeigts: viltus,
};
konst newTodo = gaidīt Todo (validTodo);
gaidīt newTodo.save();
gaidīt(jaunsTodo._id).toBeDefined();
gaidīt(jaunsTodo.lieta).būt(validTodo.lieta);
gaidīt(jaunsTodo.pabeigts).būt(validTodo.pabeigts);
});
});

Šis izveido jaunu dokumentu datu bāzē kas satur datus mainīgajā validTodo. Pēc tam atgrieztais objekts tiek pārbaudīts attiecībā pret paredzamajām vērtībām. Lai šis tests izdotos, atgrieztajai vērtībai ir jābūt objekta ID. Arī vērtībām vienumā un aizpildītajos laukos ir jāatbilst vērtībām validTodo objektā.

Papildus parastas lietošanas gadījuma pārbaudei ir jāpārbauda arī neveiksmīgs lietošanas gadījums. No mūsu plānotajiem testiem jums ir jāpārbauda mangusa modelis ar todo objektu, kurā trūkst obligātā lauka un viens ar nepareizu veidu.

Pievienojiet otru testu tam pašam apraksta blokam šādi:

 tas ("todo vienumam bez obligātajiem laukiem vajadzētu neizdoties", asinhrons () => {
ļaut invalidTodo = {
lieta: "Nomazgā traukus",
};
mēģināt {
konst newTodo = jauns Todo (invalidTodo);
gaidīt newTodo.save();
} noķert (kļūda) {
gaidīt(kļūda).toBeInstanceOf(mangusts.Kļūda.Validation Error);
gaidīt(kļūda.kļūdas.pabeigts).toBeDefined();
}
});

Modelis Todo mangusts sagaida gan vienumu, gan aizpildītos laukus. Ja mēģināt saglabāt uzdevumu bez kāda no šiem laukiem, tam vajadzētu parādīties kļūdas ziņojumā. Šajā testā tiek izmantots try…catch bloks, lai uztvertu izmesto kļūdu. Pārbaudē tiek sagaidīts, ka kļūdas ir mangusa validācijas kļūda, un tās rodas no trūkstošā aizpildītā lauka.

Lai pārbaudītu, vai modelis rada kļūdu, ja izmantojat nepareiza veida vērtības, pievienojiet apraksta blokam šādu kodu.

 tas ("vajadzētu neizdoties uzdevuma vienumam ar nepareiza veida laukiem", asinhrons () => {
ļaut invalidTodo = {
lieta: "Nomazgā traukus",
pabeigts: "Nepatiesi"
};
mēģināt {
konst newTodo = jauns Todo (invalidTodo);
gaidīt newTodo.save();
} noķert (kļūda) {
gaidīt(kļūda).toBeInstanceOf(mangusts.Kļūda.Validation Error);
gaidīt(kļūda.kļūdas.pabeigts).toBeDefined();
}
});

Ņemiet vērā, ka aizpildītā lauka vērtība ir virkne, nevis Būla vērtība. Pārbaudē tiek sagaidīta validācijas kļūda, jo modelis sagaida Būla vērtību.

MongoMemoryServer un Jest veido lielisku komandu

Mongo-memory-server npm pakotne nodrošina vienkāršu risinājumu Mongoose modeļu testēšanai. Jūs varat saglabāt fiktīvus datus atmiņā, nepieskaroties lietojumprogrammas datu bāzei.

Varat izmantot MongoMemoryServer ar Jest, lai rakstītu Mongoose modeļu testus. Ņemiet vērā, ka tas neaptver visus iespējamos testus, ko varat rakstīt saviem modeļiem. Šie testi būs atkarīgi no jūsu shēmas.