Testovanie modelov Mongoose môže byť náročné, pretože musíte písať testy, ktoré nezasahujú do vašej skutočnej databázy. Balík pamäťového servera MongoDB ponúka jednoduché riešenie. Umožňuje vám ukladať testovacie údaje do pamäte aplikácie.

V tomto návode vytvoríte jednoduchý model Mongoose a napíšete testy pomocou Jest a pamäťového servera MongoDB.

Čo je to pamäťový server MongoDB?

Posledná vec, ktorú chcete, je uložiť falošné údaje do vašej skutočnej databázy, čo sa môže stať, ak sa k nej pripojíte počas testovania. Namiesto toho sa môžete rozhodnúť použiť na ukladanie údajov samostatnú lokálnu inštanciu MongoDB. Aj keď to funguje, je to nemožné, ak vaše testy bežia v cloude. Navyše, pripojenie a dopytovanie skutočnej databázy počas každého testu môže byť drahé.

Pamäťový server MongoDB, však spustí skutočný server MongoDB a umožní vám uložiť testovacie údaje do pamäte. Vďaka tomu je to rýchlejšie ako používanie lokálnej databázy MongoDB, pretože údaje sa nezapisujú na fyzický disk.

Vytvorenie modelu Mongoose

instagram viewer

Modely Mongoose poskytujú rozhranie na prepojenie s databázou MongoDB. Ak ich chcete vytvoriť, musíte ich skompilovať zo schémy Mongoose, ktorý definuje váš dátový model MongoDB. Tento tutoriál použije schému pre dokument úlohy. Bude obsahovať názov a vyplnené polia.

Spustite nasledujúci príkaz v termináli, aby ste vytvorili nový priečinok a prejdite do neho.

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

Inicializujte npm pomocou nasledujúceho príkazu:

npm init -y

The -y flag dáva pokyn npm, aby vygeneroval súbor package.json s predvolenými hodnotami.

Vykonaním tohto príkazu nainštalujete mangusta balík:

npm Inštalácia mangusta

Vytvorte nový súbor s názvom todo.model.js a definujte schému úloh:

konšt mangusta = vyžadovať("mangusta")
konšt { Schéma } = mongoose
konšt TodoSchema = Nový Schéma({
položka: {
typ: Reťazec,
požadovaný: pravda
},
dokončené: {
typ: Boolean,
požadovaný: pravda
}
})

Na konci tohto súboru vytvorte a exportujte model úlohy:

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

Plánovanie testov

Pri písaní testov si chcete vopred naplánovať, čo budete testovať. To zaisťuje, že testujete všetky funkcie vášho modelu.

Z nami vytvoreného modelu Mongoose by todo malo obsahovať položku typu String a vyplnené pole typu Boolean. Obe tieto polia sú povinné. To znamená, že náš test by mal zabezpečiť minimálne:

  • Platné položky sa úspešne uložia do databázy.
  • Položky bez povinných polí sa neuložia.
  • Položky s poliami neplatného typu sa neuložia.

Tieto testy napíšeme do jedného testovacieho bloku, keďže spolu súvisia. V Jest definujete tento testovací blok pomocou popísať funkciu. Napríklad:

opísať ('Test modelu úlohy', () => {
// Tu sú vaše testy
}

Nastavenie databázy

Ak chcete nastaviť pamäťový server MongoDB, vytvorte novú inštanciu pamäťového servera Mongo a pripojte sa k Mongoose. Vytvoríte tiež funkcie, ktoré budú zodpovedné za zrušenie všetkých kolekcií v databáze a odpojenie od inštancie pamäťového servera Mongo.

Spustite nasledujúci príkaz na inštaláciu mongodb-memory-server.

npm Inštalácia mongodb-Pamäť-server

Vytvorte nový súbor s názvom setuptestdb.js a importujte mongoose a mongodb-memory-server.

konšt mangusta = vyžadovať("mangusta");
konšt { MongoMemoryServer } = vyžadovať("mongodb-memory-server");

Ďalej vytvorte funkciu connectDB(). Táto funkcia vytvorí novú inštanciu pamäťového servera Mongo a pripojí sa k Mongoose. Spustíte ho pred všetkými testami na pripojenie k testovacej databáze.

nech mongo = nulový;

konšt pripojiťDB = async () => {
mongo = čakať MongoMemoryServer.create();
konšt uri = mongo.getUri();

čakať mongoose.connect (uri, {
useNewUrlParser: pravda,
použiteUnifiedTopology: pravda,
});
};

Vytvorte funkciu dropDB() pridaním nasledujúceho kódu. Táto funkcia zruší databázu, zatvorí pripojenie Mongoose a zastaví inštanciu pamäťového servera Mongo. Túto funkciu spustíte po dokončení všetkých testov.

konšt dropDB = async () => {
if (mongo) {
čakaťmangusta.spojenie.dropDatabase();
čakaťmangusta.spojenie.Zavrieť();
čakať mongo.stop();
}
};

Posledná funkcia, ktorú vytvoríte, sa nazýva dropCollections(). Zahodí všetky vytvorené kolekcie Mongoose. Spustíte ho po každom teste.

konšt dropCollections = async () => {
if (mongo) {
konšt zbierky = čakať mongoose.connection.db.collections();
pre (nech zber z zbierky) {
čakať collection.remove();
}
}
};

Nakoniec exportujte funkcie conenctDB(), dropDB() a dropCollections().

modul.exportov = { connectDB, dropDB, dropCollections}

Písanie testov

Ako už bolo spomenuté, na písanie testov budete používať Jest. Spustite nasledujúci príkaz na inštaláciu jest.

npm Inštalácia žart

V package.json súbor, konfigurovať jest. Nahraďte svoj existujúci blok „scripts“ nasledujúcim:

"skripty": {
"test": "jest --runInBand --detectOpenHandles"
},
"žart": {
"testEnvironment": "uzol"
},

Vytvorte nový súbor s názvom todo.model.test.js a importujte knižnicu mongoose, model úloh a funkcie conenctDB(), dropDB() a dropCollections():

konšt mangusta = vyžadovať("mangusta");
konšt { connectDB, dropDB, dropCollections } = vyžadovať(./setupdb");
konšt Todo = vyžadovať(./todo.model");

Pred spustením všetkých testov musíte spustiť funkciu connectDB(). S Jest môžete použiť metódu beforeAll().

Musíte tiež spustiť funkcie čistenia. Po každom teste spustite funkciu dropCollections() a funkciu dropDB() po všetkých testoch. Nemusíte to robiť ručne a môžete použiť metódy afterEach() a afterAll() od Jest.

Pridajte nasledujúci kód do súboru todo.model.test.js na nastavenie a vyčistenie databázy.

pred všetkým(async () => {
čakať connectDB();
});

po všetkom(async () => {
čakať dropDB();
});

po každom (async () => {
čakať dropCollections();
});

Teraz ste pripravení vytvoriť testy.

Prvý test skontroluje, či bola položka úlohy úspešne vložená do databázy. Skontroluje, či sa ID objektu nachádza vo vytvorenom komu a či sa údaje v ňom zhodujú s údajmi, ktoré ste odoslali do databázy.

Vytvorte popisný blok a pridajte nasledujúci kód.

opísať ("Model úlohy", () => {
to ("by mal úspešne vytvoriť položku úlohy", async () => {
nech validTodo = {
položka: "Umyť riad",
dokončené: falošný,
};
konšt newTodo = čakať Todo (validTodo);
čakať newTodo.save();
očakávať(newTodo._id).byť definovaný();
očakávať(newTodo.položka).byť(validTodo.položka);
očakávať(newTodo.dokončené).byť(validTodo.dokončené);
});
});

Toto vytvorí nový dokument v databáze obsahujúci údaje v premennej validTodo. Vrátený objekt sa potom overí podľa očakávaných hodnôt. Aby tento test prešiel, vrátená hodnota by mala mať ID objektu. Hodnoty v poli položky a dokončených polí by sa tiež mali zhodovať s hodnotami v objekte validTodo.

Okrem testovania bežného prípadu použitia musíte otestovať aj neúspešný prípad použitia. Z testov, ktoré sme naplánovali, musíte otestovať model mongoose s objektom úlohy, s chýbajúcim povinným poľom a s nesprávnym typom.

Pridajte druhý test do rovnakého bloku popisu takto:

 to ("by mala zlyhať pre položku úlohy bez povinných polí", async () => {
nech invalidTodo = {
položka: "Umyť riad",
};
skúste {
konšt newTodo = Nový Todo (invalidTodo);
čakať newTodo.save();
} chytiť (chyba) {
očakávať(chyba).toBeInstanceOf(mangusta.Chyba.ValidationError);
očakávať(chyba.chyby.dokončené).byť definovaný();
}
});

Model Todo mongoose očakáva položky aj vyplnené polia. Ak sa pokúsite uložiť úlohu bez jedného z týchto polí, mala by vyvolať chybu. Tento test používa blok try...catch na zachytenie vyvolanej chyby. Test očakáva, že chyby budú chybou overovania mongoose a pochádzajú z chýbajúceho vyplneného poľa.

Ak chcete otestovať, či model vyvolá chybu, ak použijete hodnoty nesprávneho typu, pridajte nasledujúci kód do bloku popisu.

 to ("by mal zlyhať pre položku úlohy s poľami nesprávneho typu", async () => {
nech invalidTodo = {
položka: "Umyť riad",
dokončené: "Nepravdivé"
};
skúste {
konšt newTodo = Nový Todo (invalidTodo);
čakať newTodo.save();
} chytiť (chyba) {
očakávať(chyba).toBeInstanceOf(mangusta.Chyba.ValidationError);
očakávať(chyba.chyby.dokončené).byť definovaný();
}
});

Všimnite si, že hodnota vyplneného poľa je reťazec namiesto boolovskej hodnoty. Test očakáva, že sa vyvolá chyba overenia, pretože model očakáva boolovskú hodnotu.

MongoMemoryServer a Jest tvoria skvelý tím

Balík mongo-memory-server npm poskytuje jednoduché riešenie na testovanie modelov Mongoose. Falošné údaje môžete uložiť do pamäte bez toho, aby ste sa dotkli databázy aplikácie.

MongoMemoryServer s Jest môžete použiť na písanie testov pre modely Mongoose. Upozorňujeme, že nepokrýva všetky možné testy, ktoré môžete napísať pre svoje modely. Tieto testy budú závisieť od vašej schémy.