Gali būti sunku išbandyti Mongoose modelius, nes reikia parašyti testus, kurie netrukdytų jūsų faktinei duomenų bazei. „MongoDB“ atminties serverio paketas siūlo paprastą sprendimą. Tai leidžia saugoti bandymo duomenis programos atmintyje.
Šioje pamokoje sukursite paprastą Mongoose modelį ir rašysite testus naudodami Jest ir MongoDB atminties serverį.
Kas yra MongoDB atminties serveris?
Paskutinis dalykas, kurio norite, yra išsaugoti netikrus duomenis tikroje duomenų bazėje, o tai gali atsitikti, jei prisijungsite prie jos bandymo metu. Vietoj to galite pasirinkti naudoti atskirą vietinį MongoDB egzempliorių duomenims saugoti. Nors tai veikia, neįmanoma, jei jūsų testai vykdomi debesyje. Be to, kiekvieno bandymo metu prisijungimas prie tikros duomenų bazės ir užklausų pateikimas gali būti brangus.
MongoDB atminties serveris, tačiau sukasi tikrą MongoDB serverį ir leidžia saugoti testo duomenis atmintyje. Tai daro jį greičiau nei naudojant vietinę MongoDB duomenų bazę, nes duomenys nėra įrašomi į fizinį diską.
Mongoose modelio kūrimas
Mongoose modeliai suteikia sąsają, skirtą sąsajai su MongoDB duomenų baze. Norėdami juos sukurti, turite juos sudaryti pagal Mongoose schemą, kuris apibrėžia jūsų MongoDB duomenų modelį. Šioje mokymo programoje bus naudojama darbų dokumento schema. Jame bus pavadinimas ir užpildyti laukai.
Paleiskite šią komandą terminale, kad sukurtumėte naują aplanką ir eitumėte į jį.
mkdir mongoose-model-test
cd manguto modelio testas
Inicijuokite npm naudodami šią komandą:
npm init -y
The -y vėliavėlė nurodo npm sugeneruoti paketą.json failą su numatytosiomis reikšmėmis.
Vykdykite šią komandą, kad įdiegtumėte mangustas paketas:
npm diegti mangustas
Sukurkite naują failą pavadinimu todo.model.js ir apibrėžkite todo schemą:
konst mangustas = reikalauti(„mangustas“)
konst { Schema } = mangustas
konst TodoSchema = naujas Schema({
prekė: {
tipas: Styga,
reikalingas: tiesa
},
baigtas: {
tipas: Būlio,
reikalingas: tiesa
}
})
Šio failo pabaigoje sukurkite ir eksportuokite todo modelį:
modulis.eksportas = mongoose.model ("Todo", "TodoSchema")
Testų planavimas
Rašydami testus norite iš anksto suplanuoti, ką testuosite. Tai užtikrina, kad išbandote visas savo modelio funkcijas.
Iš mūsų sukurto Mongoose modelio todo turėtų būti eilutės tipo elementas ir užpildytas Būlio tipo laukas. Abu šie laukai yra būtini. Tai reiškia, kad bent jau mūsų testas turėtų užtikrinti:
- Galiojantys elementai sėkmingai išsaugomi duomenų bazėje.
- Elementai be privalomų laukų neišsaugomi.
- Elementai su neteisingo tipo laukais neišsaugomi.
Šiuos testus parašysime viename bandymų bloke, nes jie yra susiję. Programoje „Jest“ šį bandymo bloką apibrėžiate naudodami apibūdinti funkcija. Pavyzdžiui:
apibūdinti('Todo modelio testas', () => {
// Jūsų testai pateikiami čia
}
Duomenų bazės nustatymas
Norėdami nustatyti MongoDB atminties serverį, sukursite naują Mongo atminties serverio egzempliorių ir prisijungsite prie Mongoose. Taip pat sukursite funkcijas, kurios bus atsakingos už visų kolekcijų išmetimą duomenų bazėje ir atsijungimą nuo Mongo atminties serverio egzemplioriaus.
Norėdami įdiegti, paleiskite šią komandą mongodb atminties serveris.
npm diegti mongodb-atmintis-serveris
Sukurkite naują failą pavadinimu setuptestdb.js ir importuoti mongoose ir mongodb atminties serverį.
konst mangustas = reikalauti(„mangustas“);
konst { MongoMemoryServer } = reikalauti(„mongodb-memory-server“);
Tada sukurkite funkciją connectDB (). Ši funkcija sukuria naują Mongo atminties serverio egzempliorių ir prisijungia prie Mongoose. Ją paleisite prieš visus bandymus, kad prisijungtumėte prie bandymų duomenų bazės.
leisti mongo = nulinis;
konst connectDB = async () => {
mongo = laukti MongoMemoryServer.create();
konst uri = mongo.getUri();
laukti mongoose.connect (uri, {
useNewUrlParser: tiesa,
naudokite vieningą topologiją: tiesa,
});
};
Sukurkite funkciją dropDB() pridėdami šį kodą. Ši funkcija panaikina duomenų bazę, uždaro Mongoose ryšį ir sustabdo Mongo atminties serverio egzempliorių. Šią funkciją paleisite po to, kai baigsis visi testai.
konst dropDB = async () => {
if (mongo) {
lauktimangustas.ryšis.dropDatabase();
lauktimangustas.ryšis.Uždaryti();
laukti mongo.stop();
}
};
Paskutinė funkcija, kurią sukursite, vadinama dropCollections(). Atsisako visų sukurtų Mongoose kolekcijų. Jį paleisite po kiekvieno bandymo.
konst dropCollections = async () => {
if (mongo) {
konst kolekcijos = laukti mongoose.connection.db.collections();
dėl (leisti kolekcija apie kolekcijos) {
laukti collection.remove();
}
}
};
Galiausiai eksportuokite conenctDB(), dropDB() ir dropCollections() funkcijas.
modulis.eksportas = { connectDB, dropDB, dropCollections}
Testų rašymas
Kaip minėta, testams rašyti naudosite Jest. Vykdykite šią komandą, kad įdiegtumėte jest.
npm diegti pokštas
Viduje package.json failą, konfigūruoti jest. Pakeiskite esamą „scenarijų“ bloką taip:
"scenarijus": {
"bandymas": "jest --runInBand --detectOpenHandles"
},
"pokštas": {
"testAplinka": "mazgas"
},
Sukurkite naują failą pavadinimu todo.model.test.js ir importuoti mongoose biblioteką, todo modelį ir conenctDB(), dropDB() ir dropCollections() funkcijas:
konst mangustas = reikalauti(„mangustas“);
konst { connectDB, dropDB, dropCollections } = reikalauti(./setupdb");
konst Todo = reikalauti(./todo.model");
Prieš paleidžiant visus bandymus, turite paleisti funkciją connectDB(). Naudodami Jest galite naudoti priešAll() metodą.
Taip pat turite paleisti valymo funkcijas. Po kiekvieno bandymo paleiskite funkciją dropCollections() ir funkciją dropDB() po visų testų. Jums nereikia to daryti rankiniu būdu ir galite naudoti Jest metodus afterEach() ir afterAll().
Pridėkite šį kodą prie todo.model.test.js failo, kad nustatytumėte ir išvalytumėte duomenų bazę.
prieš visus (async () => {
laukti connectDB();
});po visko(async () => {
laukti dropDB();
});
po kiekvieno(async () => {
laukti dropCollections();
});
Dabar esate pasirengę kurti testus.
Pirmojo bandymo metu bus patikrinta, ar todo elementas buvo sėkmingai įtrauktas į duomenų bazę. Jis patikrins, ar objekto ID yra sukurtame į ir ar jame esantys duomenys atitinka tuos, kuriuos atsiųsite į duomenų bazę.
Sukurkite aprašo bloką ir pridėkite šį kodą.
apibūdinti("Todo modelis", () => {
tai ("turėtų sėkmingai sukurti todo elementą", asinchroninis () => {
leisti validTodo = {
prekė: "Išplauk indus",
baigta: klaidinga,
};
konst newTodo = laukti Todo (validTodo);
laukti newTodo.save();
tikėtis(newTodo._id).ToBeDefined();
tikėtis(newTodo.elementas).būti(validTodo.elementas);
tikėtis(newTodo.baigta).būti(validTodo.baigta);
});
});
Tai sukuria naują dokumentą duomenų bazėje kuriame yra validTodo kintamojo duomenys. Tada grąžintas objektas patikrinamas pagal numatomas reikšmes. Kad šis testas būtų sėkmingas, grąžinta vertė turi turėti objekto ID. Be to, elemento ir užpildytų laukų reikšmės turi sutapti su validTodo objekto reikšmėmis.
Be įprasto naudojimo atvejo patikrinimo, turite išbandyti ir netinkamo naudojimo atvejį. Iš mūsų suplanuotų bandymų reikia išbandyti manguto modelį su „todo“ objektu, kuriame trūksta būtino lauko ir su netinkamu tipu.
Pridėkite antrą testą prie to paties aprašo bloko taip:
tai ("turėtų nepavykti todo elementui be būtinų laukų", asinchroninis () => {
leisti invalidTodo = {
prekė: "Išplauk indus",
};
bandyti {
konst newTodo = naujas Todo (invalidTodo);
laukti newTodo.save();
} sugauti (klaida) {
tikėtis(klaida).toBeInstanceOf(mangustas.Klaida.Validation Error);
tikėtis(klaida.klaidos.baigta).ToBeDefined();
}
});
Todo mongoose modelis tikisi tiek elemento, tiek užpildytų laukų. Jei bandysite išsaugoti užduotį be vieno iš šių laukų, turėtų būti rodoma klaida. Šiame bandyme naudojamas try…catch blokas, kad užfiksuotų išmestą klaidą. Atliekant bandymą tikimasi, kad klaidos yra neaiškios patvirtinimo klaidos ir atsiranda dėl trūkstamo užpildyto lauko.
Norėdami patikrinti, ar modelis nerodo klaidos, jei naudojate netinkamo tipo reikšmes, į aprašo bloką pridėkite šį kodą.
tai ("turėtų nepavykti todo elementui su netinkamo tipo laukais", asinchroninis () => {
leisti invalidTodo = {
prekė: "Išplauk indus",
baigta: "Netiesa"
};
bandyti {
konst newTodo = naujas Todo (invalidTodo);
laukti newTodo.save();
} sugauti (klaida) {
tikėtis(klaida).toBeInstanceOf(mangustas.Klaida.Validation Error);
tikėtis(klaida.klaidos.baigta).ToBeDefined();
}
});
Atminkite, kad užpildyto lauko reikšmė yra eilutė, o ne loginė. Bandymas tikisi, kad bus pateikta patvirtinimo klaida, nes modelis tikisi loginės reikšmės.
„MongoMemoryServer“ ir „Jest“ sudaro puikią komandą
Mongo-memory-server npm paketas yra paprastas sprendimas bandant Mongoose modelius. Galite saugoti netikrus duomenis atmintyje neliesdami savo programos duomenų bazės.
Galite naudoti MongoMemoryServer su Jest norėdami rašyti Mongoose modelių testus. Atminkite, kad jis neapima visų galimų testų, kuriuos galite parašyti savo modeliams. Tie testai priklausys nuo jūsų schemos.