Mongoose mudelite testimine võib olla keeruline, kuna peate kirjutama teste, mis ei sega teie tegelikku andmebaasi. MongoDB mäluserveri pakett pakub lihtsat lahendust. See võimaldab salvestada testiandmed rakenduse mällu.
Selles õpetuses saate luua lihtsa Mongoose mudeli ja kirjutada teste, kasutades Jest ja MongoDB mäluserverit.
Mis on MongoDB mäluserver?
Viimane asi, mida soovite, on salvestada võltsandmed oma tõelisse andmebaasi, mis võib juhtuda, kui loote sellega testimise ajal ühenduse. Selle asemel võite oma andmete salvestamiseks kasutada eraldi kohalikku MongoDB eksemplari. Kuigi see töötab, on see võimatu, kui teie testid käitatakse pilves. Veelgi enam, tõelise andmebaasi ühendamine ja päringute tegemine iga testi ajal võib olla kulukas.
MongoDB mäluserver, aga keerutab päris MongoDB-serveri ja võimaldab testiandmed mällu salvestada. See muudab selle kiiremaks kui kohaliku MongoDB andmebaasi kasutamine, kuna andmeid ei kirjutata füüsilisele kettale.
Mongoose mudeli loomine
Mongoose mudelid pakuvad liidest MongoDB andmebaasiga liidestamiseks. Nende loomiseks peate need koostama Mongoose skeemi järgi,
mis määrab teie MongoDB andmemudeli. See õpetus kasutab ülesannete dokumendi skeemi. See sisaldab pealkirja ja täidetud välju.Uue kausta loomiseks ja selle juurde navigeerimiseks käivitage terminalis järgmine käsk.
mkdir mongoose-model-test
cd mangu-mudel-test
Initsialiseerige npm järgmise käsuga:
npm init -y
The -y lipp annab npm-ile korralduse luua vaikeväärtustega fail package.json.
Käivitage see käsk, et installida mangust pakett:
npm installida mangust
Looge uus fail nimega todo.model.js ja määratlege ülesande skeem:
konst mangust = nõuda("mongoose")
konst { Skeem } = mangust
konst TodoSchema = uus Skeem({
üksus: {
tüüp: String,
nõutud: tõsi
},
lõpetatud: {
tüüp: Boolean,
nõutud: tõsi
}
})
Selle faili lõpus looge ja eksportige ülesandemudel:
moodul.eksporti = mongoose.model("Todo", TodoSchema)
Testide planeerimine
Teste kirjutades tahad eelnevalt planeerida, mida testima hakkad. See tagab, et testite kõiki oma mudeli funktsioone.
Meie loodud Mongoose'i mudelist peaks ülesanne sisaldama String tüüpi elementi ja täidetud Boolean tüüpi välja. Mõlemad väljad on kohustuslikud. See tähendab, et meie test peaks vähemalt tagama:
- Kehtivad üksused salvestatakse edukalt andmebaasi.
- Ilma kohustuslike väljadeta üksusi ei salvestata.
- Kehtetu tüüpi väljadega üksusi ei salvestata.
Kirjutame need testid ühte testplokki, kuna need on omavahel seotud. Jestis saate selle testploki määratleda, kasutades kirjeldada funktsiooni. Näiteks:
kirjelda ('Todo mudeli test', () => {
// Teie testid lähevad siia
}
Andmebaasi seadistamine
MongoDB mäluserveri seadistamiseks loote uue Mongo mäluserveri eksemplari ja loote ühenduse Mongoose'iga. Samuti loote funktsioonid, mis vastutavad kõigi andmebaasis olevate kogude eemaldamise ja Mongo mäluserveri eksemplari ühenduse katkestamise eest.
Käivitage installimiseks järgmine käsk mongodb-mäluserver.
npm installida mongodb-mälu-server
Looge uus fail nimega setuptestdb.js ja importida mongoose ja mongodb-mäluserverit.
konst mangust = nõuda("mongoose");
konst { MongoMemoryServer } = nõuda("mongodb-mäluserver");
Järgmisena looge funktsioon connectDB (). See funktsioon loob uue Mongo mäluserveri eksemplari ja loob ühenduse Mongoose'iga. Te käivitate selle enne kõiki teste, et luua ühendus testide andmebaasiga.
lase mongo = null;
konst connectDB = asünkr () => {
mongo = ootama MongoMemoryServer.create();
konst uri = mongo.getUri();
ootama mongoose.connect (uri, {
useNewUrlParser: tõsi,
UseUnifiedTopology: tõsi,
});
};
Looge funktsioon dropDB(), lisades järgmise koodi. See funktsioon katkestab andmebaasi, sulgeb Mongoose'i ühenduse ja peatab Mongo mäluserveri eksemplari. Te käivitate selle funktsiooni pärast kõigi testide käitamise lõpetamist.
konst dropDB = asünkr () => {
if (mongo) {
ootamamangust.ühendus.dropDatabase();
ootamamangust.ühendus.Sulge();
ootama mongo.stop();
}
};
Viimast funktsiooni, mille loote, nimetatakse dropCollections(). See tühistab kõik loodud Mongoose kollektsioonid. Te käivitate selle pärast iga testi.
konst dropCollections = asünkr () => {
if (mongo) {
konst kogud = ootama mongoose.connection.db.collections();
jaoks (lase kogumine kohta kogud) {
ootama collection.remove();
}
}
};
Lõpuks eksportige funktsioonid conenctDB(), dropDB() ja dropCollections().
moodul.eksporti = { connectDB, dropDB, dropCollections}
Testide kirjutamine
Nagu mainitud, kasutate testide kirjutamiseks Jesti. Käivitage jesti installimiseks järgmine käsk.
npm installida nalja
Aastal package.json faili, konfigureerige jest. Asendage olemasolev "skriptide" plokk järgmisega:
"skriptid": {
"katsetada": "jest --runInBand --detectOpenHandles"
},
"nalja": {
"testkeskkond": "sõlm"
},
Looge uus fail nimega todo.model.test.js ja importige mongoose teek, todo mudel ja funktsioonid conenctDB(), dropDB() ja dropCollections():
konst mangust = nõuda("mongoose");
konst { connectDB, dropDB, dropCollections} = nõuda(./setupdb");
konst Todo = nõuda("./todo.mudel");
Enne kõigi testide käivitamist peate käivitama funktsiooni connectDB(). Jestiga saate kasutada meetodit beforeAll().
Samuti peate käivitama puhastusfunktsioonid. Pärast iga testi käivitage funktsioon dropCollections () ja funktsioon dropDB () pärast kõiki teste. Te ei pea seda käsitsi tegema ja saate kasutada Jesti meetodeid afterEach() ja afterAll().
Lisage andmebaasi seadistamiseks ja puhastamiseks faili todo.model.test.js järgmine kood.
ennekõike(asünkr () => {
ootama connectDB();
});Pealegi(asünkr () => {
ootama dropDB();
});
pärast iga(asünkr () => {
ootama dropCollections();
});
Nüüd olete valmis teste looma.
Esimese testiga kontrollitakse, kas ülesande üksus sisestati edukalt andmebaasi. See kontrollib, kas objekti ID on loodud objektis olemas ja kas selles olevad andmed ühtivad teie poolt andmebaasi saadetud andmetega.
Looge kirjeldav plokk ja lisage järgmine kood.
kirjelda ("Todo mudel", () => {
see ("peaks edukalt looma ülesandeüksuse", asünkroon () => {
lase validTodo = {
üksus: "Nõusid pesema",
lõpetatud: vale,
};
konst uusTodo = ootama Todo (validTodo);
ootama uusTodo.save();
oodata(uusTodo._id).toBeDefined();
oodata(uusTodo.element).olla(validTodo.element);
oodata(uusTodo.lõpetatud).olla(validTodo.lõpetatud);
});
});
See loob andmebaasis uue dokumendi mis sisaldab validTodo muutuja andmeid. Seejärel kontrollitakse tagastatud objekt eeldatavate väärtuste suhtes. Selle testi läbimiseks peab tagastatud väärtusel olema objekti ID. Samuti peaksid üksuse ja täidetud väljade väärtused ühtima validTodo objekti väärtustega.
Lisaks tavakasutusjuhtumi testimisele peate testima ka ebaõnnestunud kasutusjuhtumit. Meie kavandatud testidest peate katsetama mangumudelit todo-objektiga, mille kohustuslik väli on puudu ja üks vale tüübiga.
Lisage samale kirjeldusplokile teine test järgmiselt:
see ("peaks ilma kohustuslike väljadeta ülesandeüksuse puhul ebaõnnestuma", asünkroon () => {
lase invalidTodo = {
üksus: "Nõusid pesema",
};
proovige {
konst uusTodo = uus Todo (invalidTodo);
ootama uusTodo.save();
} püüda (viga) {
oodata(viga).toBeInstanceOf(mangust.Viga.ValidationError);
oodata(viga.vead.lõpetatud).toBeDefined();
}
});
Todo mongoose mudel ootab nii eset kui ka täidetud välju. See peaks andma veateate, kui proovite ülesande salvestada ilma ühegi neist väljadest. See test kasutab visatud vea tabamiseks plokki try…catch. Test eeldab, et vead on mongoosne valideerimisviga ja tulenevad puuduvast täidetud väljast.
Et testida, kas mudel annab vale tüüpi väärtuste kasutamisel tõrke, lisage kirjeldavasse plokki järgmine kood.
see ("peaks vale tüüpi väljadega ülesandeüksuse puhul ebaõnnestuma", asünkroon () => {
lase invalidTodo = {
üksus: "Nõusid pesema",
lõpetatud: "Vale"
};
proovige {
konst uusTodo = uus Todo (invalidTodo);
ootama uusTodo.save();
} püüda (viga) {
oodata(viga).toBeInstanceOf(mangust.Viga.ValidationError);
oodata(viga.vead.lõpetatud).toBeDefined();
}
});
Pange tähele, et täidetud välja väärtus on tõeväärtuse asemel string. Test eeldab valideerimisvea ilmnemist, kuna mudel eeldab tõeväärtust.
MongoMemoryServer ja Jest moodustavad suurepärase meeskonna
Mongo-mäluserveri npm pakett pakub lihtsat lahendust Mongoose mudelite testimiseks. Saate salvestada näivaid andmeid mällu ilma oma rakenduse andmebaasi puudutamata.
Mongoose mudelite testide kirjutamiseks saate kasutada MongoMemoryServerit koos Jestiga. Pange tähele, et see ei hõlma kõiki võimalikke teste, mida saate oma mudelite jaoks kirjutada. Need testid sõltuvad teie skeemist.