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.

instagram viewer

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.