Kihívást jelenthet a Mongoose modellek tesztelése, mert olyan teszteket kell írnia, amelyek nem zavarják a tényleges adatbázist. A MongoDB memóriaszerver csomag egyszerű megoldást kínál. Lehetővé teszi a tesztadatok tárolását az alkalmazás memóriájában.
Ebben az oktatóanyagban egy egyszerű Mongoose-modellt készíthet, és teszteket írhat a Jest és a MongoDB memóriakiszolgáló segítségével.
Mi az a MongoDB memóriakiszolgáló?
Az utolsó dolog, amit szeretne, az, hogy hamis adatokat mentsen a valódi adatbázisába, ami akkor történhet meg, ha a tesztelés során csatlakozik hozzá. Ehelyett dönthet úgy, hogy egy különálló helyi MongoDB-példányt használ az adatok tárolására. Bár ez működik, lehetetlen, ha a tesztek a felhőn futnak. Ráadásul egy valós adatbázis csatlakoztatása és lekérdezése minden teszt során költséges lehet.
MongoDB memóriaszerver, azonban felpörget egy valódi MongoDB szervert, és lehetővé teszi a tesztadatok tárolását a memóriában. Ez gyorsabbá teszi, mint egy helyi MongoDB adatbázis használata, mivel az adatok nem fizikai lemezre kerülnek.
A Mongoose modell létrehozása
A Mongoose modellek interfészt biztosítanak a MongoDB adatbázissal való interfészhez. Létrehozásához össze kell őket fordítani egy Mongoose sémából, amely meghatározza a MongoDB adatmodelljét. Ez az oktatóanyag sémát használ egy teendődokumentumhoz. Tartalmazza a címet és a kitöltött mezőket.
Futtassa a következő parancsot a terminálon egy új mappa létrehozásához, és navigáljon hozzá.
mkdir mongoose-model-test
CD mongúz-modell-teszt
Inicializálja az npm-et a következő paranccsal:
npm init -y
Az -y A flag arra utasítja az npm-et, hogy állítson elő egy package.json fájlt alapértelmezett értékekkel.
Hajtsa végre ezt a parancsot a indiai menyét csomag:
npm telepítés indiai menyét
Hozzon létre egy új fájlt, melynek neve todo.model.js és határozza meg a todo sémát:
const mangúz = igényelnek("indiai menyét")
const { Séma } = mangúz
const TodoSchema = új Séma({
elem: {
típus: Húr,
kívánt: igaz
},
teljesítve: {
típus: Boolean,
kívánt: igaz
}
})
A fájl végén hozza létre és exportálja a todo modellt:
modult.export = mongoose.model("Todo", TodoSchema)
A tesztek tervezése
A tesztek írásakor szeretné előre megtervezni, hogy mit fog tesztelni. Ez biztosítja, hogy modellje összes funkcióját tesztelje.
Az általunk létrehozott Mongoose modellből a teendőnek tartalmaznia kell egy String típusú elemet és egy kitöltött Boolean típusú mezőt. Mindkét mező kitöltése kötelező. Ez azt jelenti, hogy a tesztünknek legalább a következőket kell biztosítania:
- Az érvényes elemek sikeresen mentésre kerülnek az adatbázisba.
- A kötelező mezők nélküli elemek nem kerülnek mentésre.
- Az érvénytelen típusú mezőket tartalmazó elemek nem kerülnek mentésre.
Ezeket a teszteket egy tesztblokkba írjuk, mivel összefüggenek. A Jestben ezt a tesztblokkot a leírni funkció. Például:
leír('Todo Model Test', () => {
// Ide kerülnek a tesztek
}
Az adatbázis beállítása
A MongoDB memóriakiszolgáló beállításához létre kell hoznia egy új Mongo memóriakiszolgáló-példányt, és csatlakoznia kell a Mongoose-hoz. Olyan függvényeket is létrehozhat, amelyek az adatbázisban lévő összes gyűjtemény eldobásáért és a Mongo memóriaszerver-példányról való leválasztásáért felelősek.
A telepítéshez futtassa a következő parancsot mongodb-memóriaszerver.
npm telepítés mongodb-memória-szerver
Hozzon létre egy új fájlt, melynek neve setuptestdb.js és import mongoose és mongodb-memory-server.
const mangúz = igényelnek("indiai menyét");
const { MongoMemoryServer } = igényelnek("mongodb-memória-szerver");
Ezután hozzon létre egy connectDB() függvényt. Ez a funkció létrehoz egy új Mongo memóriakiszolgáló-példányt, és csatlakozik a Mongoose-hoz. Futtassa az összes teszt előtt, hogy csatlakozzon a tesztadatbázishoz.
hagyja mongó = nulla;
const connectDB = async () => {
mongó = várják MongoMemoryServer.create();
const uri = mongo.getUri();
várják mongoose.connect (uri, {
useNewUrlParser: igaz,
UseUnifiedTopology: igaz,
});
};
Hozzon létre egy dropDB() függvényt a következő kód hozzáadásával. Ez a funkció eldobja az adatbázist, bezárja a Mongoose kapcsolatot, és leállítja a Mongo memóriakiszolgáló példányt. Ezt a funkciót az összes teszt futása után fogja futtatni.
const dropDB = async () => {
if (mongo) {
várjákindiai menyét.kapcsolat.dropDatabase();
várjákindiai menyét.kapcsolat.Bezárás();
várják mongo.stop();
}
};
Az utoljára létrehozandó függvény neve dropCollections(). Eldobja az összes létrehozott Mongoose gyűjteményt. Minden teszt után lefuttatja.
const dropCollections = async () => {
if (mongo) {
const gyűjtemények = várják mongoose.connection.db.collections();
számára (hagyja Gyűjtemény nak,-nek gyűjtemények) {
várják collection.remove();
}
}
};
Végül exportálja a conenctDB(), dropDB() és dropCollections() függvényeket.
modult.export = { connectDB, dropDB, dropCollections}
A tesztek írása
Mint már említettük, a Jest-et fogja használni a tesztek megírásához. Futtassa a következő parancsot a jest telepítéséhez.
npm telepítés tréfa
Ban,-ben package.json fájl, configure jest. Cserélje le a meglévő "scripts" blokkot a következőre:
"forgatókönyvek": {
"teszt": "jest --runInBand --detectOpenHandles"
},
"tréfa": {
"tesztkörnyezet": "csomópont"
},
Hozzon létre egy új fájlt, melynek neve todo.model.test.js és importálja a mongoose könyvtárat, a todo modellt, valamint a conenctDB(), dropDB() és dropCollections() függvényeket:
const mangúz = igényelnek("indiai menyét");
const { connectDB, dropDB, dropCollections } = igényelnek(./setupdb");
const Todo = igényelnek(./todo.model");
Az összes teszt futtatása előtt le kell futtatnia a connectDB() függvényt. A Jest segítségével a beforeAll() metódus használható.
A tisztítási funkciókat is futtatnia kell. Minden teszt után futtassa a dropCollections() függvényt és a dropDB() függvényt az összes teszt után. Ezt nem kell manuálisan megtennie, és használhatja a Jest afterEach() és afterAll() metódusait.
Adja hozzá a következő kódot a todo.model.test.js fájlhoz az adatbázis beállításához és megtisztításához.
minden előtt(async () => {
várják connectDB();
});végül(async () => {
várják dropDB();
});
afterEach(async () => {
várják dropCollections();
});
Most készen áll a tesztek létrehozására.
Az első teszt azt ellenőrzi, hogy a todo elem sikeresen bekerült-e az adatbázisba. Ellenőrzi, hogy az objektum azonosítója megtalálható-e a létrehozott objektumban, és hogy a benne lévő adatok megegyeznek-e az adatbázisba küldöttekkel.
Hozzon létre egy leíró blokkot, és adja hozzá a következő kódot.
leír("Todo modell", () => {
azt("sikeresen létre kell hoznia egy teendőelemet", aszinkron () => {
hagyja validTodo = {
tétel: "Mosogatni",
elkészült: hamis,
};
const newTodo = várják Todo (validTodo);
várják newTodo.save();
elvárják(newTodo._id).meg kell határozni();
elvárják(newTodo.tétel).lenni(validTodo.tétel);
elvárják(newTodo.befejezte).lenni(validTodo.befejezte);
});
});
Ez új dokumentumot hoz létre az adatbázisban amely tartalmazza a validTodo változó adatait. A visszaadott objektum ezután érvényesítésre kerül a várt értékekkel szemben. Ahhoz, hogy ez a teszt sikeres legyen, a visszaadott értéknek rendelkeznie kell egy objektumazonosítóval. Ezenkívül az elemben és a kitöltött mezőkben lévő értékeknek meg kell egyeznie a validTodo objektum értékeivel.
A normál használati eset tesztelése mellett egy hibás használati esetet is tesztelnie kell. Az általunk tervezett tesztek közül a mongúz modellt egy todo objektummal kell tesztelni, hiányzó kötelező mezővel és egy nem megfelelő típussal.
Adjon hozzá egy második tesztet ugyanahhoz a leíró blokkhoz, az alábbiak szerint:
azt("a kötelező mezők nélküli teendő elem esetén sikertelennek kell lennie", aszinkron () => {
hagyja invalidTodo = {
tétel: "Mosogatni",
};
próbálja meg {
const newTodo = új Todo (invalidTodo);
várják newTodo.save();
} fogás (hiba) {
elvárják(hiba).toBeInstanceOf(indiai menyét.Hiba.ValidationError);
elvárják(hiba.hibák.befejezte).meg kell határozni();
}
});
A Todo mongoose modell mind a tételt, mind a kitöltött mezőket várja. Hibaüzenetet kell kiadnia, ha egy teendőt e mezők egyike nélkül próbál menteni. Ez a teszt a try…catch blokkot használja a kidobott hiba elkapására. A teszt azt várja, hogy a hibák durva érvényesítési hibák, és a hiányzó kitöltött mezőből származnak.
Annak teszteléséhez, hogy a modell hibát ad-e, ha nem megfelelő típusú értékeket használ, adja hozzá a következő kódot a leírási blokkhoz.
azt("hibásnak kell lennie a rossz típusú mezőket tartalmazó teendőelemnél", aszinkron () => {
hagyja invalidTodo = {
tétel: "Mosogatni",
elkészült: "Hamis"
};
próbálja meg {
const newTodo = új Todo (invalidTodo);
várják newTodo.save();
} fogás (hiba) {
elvárják(hiba).toBeInstanceOf(indiai menyét.Hiba.ValidationError);
elvárják(hiba.hibák.befejezte).meg kell határozni();
}
});
Vegye figyelembe, hogy a kitöltött mező értéke egy karakterlánc, nem pedig logikai érték. A teszt érvényesítési hibát vár, mivel a modell logikai értéket vár.
A MongoMemoryServer és a Jest nagyszerű csapatot alkotnak
A mongo-memory-server npm csomag egyszerű megoldást kínál a Mongoose modellek tesztelésére. Hamis adatokat tárolhat a memóriában anélkül, hogy megérintené az alkalmazás adatbázisát.
A MongoMemoryServer és a Jest segítségével teszteket írhat Mongoose modellekhez. Vegye figyelembe, hogy nem fedi le az összes lehetséges tesztet, amelyet a modelljeihez írhat. Ezek a tesztek a sémától függenek.