Mongoose-mallien testaaminen voi olla haastavaa, koska sinun on kirjoitettava testejä, jotka eivät häiritse todellista tietokantaasi. MongoDB-muistipalvelinpaketti tarjoaa suoraviivaisen ratkaisun. Sen avulla voit tallentaa testitiedot sovelluksen muistiin.

Tässä opetusohjelmassa luot yksinkertaisen Mongoose-mallin ja kirjoitat testejä Jestillä ja MongoDB-muistipalvelimella.

Mikä on MongoDB-muistipalvelin?

Viimeinen asia, jonka haluat, on tallentaa väärennetyt tiedot todelliseen tietokantaan, mikä saattaa tapahtua, jos muodostat yhteyden siihen testauksen aikana. Sen sijaan voit halutessasi käyttää erillistä paikallista MongoDB-esiintymää tietojen tallentamiseen. Vaikka tämä toimii, on mahdotonta, jos testit suoritetaan pilvessä. Lisäksi oikean tietokannan yhdistäminen ja kyselyjen tekeminen jokaisen testin aikana voi tulla kalliiksi.

MongoDB-muistipalvelin, kuitenkin pyörittää todellista MongoDB-palvelinta ja antaa sinun tallentaa testitiedot muistiin. Tämä tekee siitä nopeamman kuin paikallisen MongoDB-tietokannan käyttämisen, koska tietoja ei kirjoiteta fyysiselle levylle.

instagram viewer

Mongoose-mallin luominen

Mongoose-mallit tarjoavat käyttöliittymän MongoDB-tietokantaan. Niiden luomiseksi sinun on käännettävä ne Mongoose-skeemasta, joka määrittää MongoDB-tietomallisi. Tämä opetusohjelma käyttää kaaviota tehtävädokumentille. Se sisältää otsikon ja täytetyt kentät.

Luo uusi kansio ja siirry siihen suorittamalla seuraava komento päätteessä.

mkdir mongoose-model-test
CD mangoose-malli-testi

Alusta npm seuraavalla komennolla:

npm init -y

The -y lippu kehottaa npm: ää luomaan package.json-tiedoston oletusarvoilla.

Suorita tämä komento asentaaksesi mungo paketti:

npm Asentaa mungo

Luo uusi tiedosto nimeltä todo.model.js ja määritä todo-skeema:

konst mangusti = vaatia("mungo")
konst { Kaava } = mangoose
konst TodoSchema = Uusi Schema({
tuote: {
tyyppi: merkkijono,
vaaditaan: totta
},
suoritettu: {
tyyppi: Boolean,
vaaditaan: totta
}
})

Luo ja vie todo-malli tämän tiedoston lopussa:

moduuli.vientiä = mongoose.model("Todo", TodoSchema)

Testien suunnittelu

Testejä kirjoittaessasi haluat suunnitella etukäteen, mitä testaat. Tämä varmistaa, että testaat mallisi kaikkia toimintoja.

Luomamme Mongoose-mallin perusteella tehtävän tulisi sisältää String-tyyppinen alkio ja täytetty Boolean-tyyppinen kenttä. Molemmat kentät ovat pakollisia. Tämä tarkoittaa, että testimme tulisi varmistaa vähintään:

  • Kelvolliset kohteet tallennetaan onnistuneesti tietokantaan.
  • Kohteita, joissa ei ole pakollisia kenttiä, ei tallenneta.
  • Kohteita, joiden kentät ovat virheellisiä, ei tallenneta.

Kirjoitamme nämä testit yhteen testilohkoon, koska ne liittyvät toisiinsa. Jestissä määrität tämän testilohkon käyttämällä kuvata toiminto. Esimerkiksi:

kuvaile ('Todo mallitesti', () => {
// Testisi menevät tänne
}

Tietokannan määrittäminen

Voit määrittää MongoDB-muistipalvelimen luomalla uuden Mongo-muistipalvelimen ilmentymän ja muodostamalla yhteyden Mongooseen. Luot myös toimintoja, jotka vastaavat kaikkien tietokannan kokoelmien poistamisesta ja yhteyden katkaisemisesta Mongo-muistipalvelinesiintymästä.

Suorita seuraava komento asentaaksesi mongodb-muistipalvelin.

npm Asentaa mongodb-muisti-palvelin

Luo uusi tiedosto nimeltä setuptestdb.js ja tuoda mongoose ja mongodb-muistipalvelin.

konst mangusti = vaatia("mungo");
konst { MongoMemoryServer } = vaatia("mongodb-muistipalvelin");

Luo seuraavaksi connectDB()-funktio. Tämä toiminto luo uuden Mongo-muistipalvelimen ilmentymän ja muodostaa yhteyden Mongooseen. Suoritat sen ennen kaikkia testejä muodostaaksesi yhteyden testitietokantaan.

päästää mongo = tyhjä;

konst connectDB = asynk () => {
mongo = odottaa MongoMemoryServer.create();
konst uri = mongo.getUri();

odottaa mongoose.connect (uri, {
useNewUrlParser: totta,
useUnifiedTopology: totta,
});
};

Luo dropDB()-funktio lisäämällä seuraava koodi. Tämä toiminto pudottaa tietokannan, sulkee Mongoose-yhteyden ja pysäyttää Mongo-muistipalvelimen ilmentymän. Suoritat tämän toiminnon, kun kaikki testit on suoritettu.

konst dropDB = asynk () => {
if (mongo) {
odottaamungo.yhteys.dropDatabase();
odottaamungo.yhteys.kiinni();
odottaa mongo.stop();
}
};

Viimeinen luomasi funktio on nimeltään dropCollections(). Se pudottaa kaikki luodut Mongoose-kokoelmat. Suoritat sen jokaisen testin jälkeen.

konst dropCollections = asynk () => {
if (mongo) {
konst kokoelmat = odottaa mongoose.connection.db.collections();
varten (päästää kokoelma / kokoelmat) {
odottaa collection.remove();
}
}
};

Vie lopuksi conenctDB(), dropDB() ja dropCollections()-funktiot.

moduuli.vientiä = { connectDB, dropDB, dropCollections}

Testien kirjoittaminen

Kuten mainittiin, käytät Jestiä testien kirjoittamiseen. Asenna jest suorittamalla seuraava komento.

npm Asentaa vitsi

Vuonna package.json tiedosto, konfiguroi jest. Korvaa olemassa oleva "skriptit" -lohkosi seuraavalla:

"käsikirjoituksia": {
"testata": "jest --runInBand --detectOpenHandles"
},
"vitsi": {
"testiympäristössä": "solmu"
},

Luo uusi tiedosto nimeltä todo.model.test.js ja tuo mongoose-kirjasto, todo-malli ja conenctDB(), dropDB()- ja dropCollections()-funktiot:

konst mangusti = vaatia("mungo");
konst { connectDB, dropDB, dropCollections} = vaatia(./setupdb");
konst Tehtävä = vaatia(./todo.malli");

Sinun on suoritettava connectDB()-funktio ennen kuin kaikki testit suoritetaan. Jestin kanssa voit käyttää beforeAll()-menetelmää.

Sinun on myös suoritettava puhdistustoimintoja. Suorita jokaisen testin jälkeen dropCollections()-funktio ja dropDB()-funktio kaikkien testien jälkeen. Sinun ei tarvitse tehdä tätä manuaalisesti, ja voit käyttää Jestin afterEach()- ja afterAll()-menetelmiä.

Lisää seuraava koodi todo.model.test.js-tiedostoon tietokannan määrittämiseksi ja puhdistamiseksi.

ennen kaikkea(asynk () => {
odottaa connectDB();
});

kuitenkin(asynk () => {
odottaa dropDB();
});

jokaisen jälkeen(asynk () => {
odottaa dropCollections();
});

Olet nyt valmis luomaan testit.

Ensimmäinen testi tarkistaa, onko todo-kohde onnistuneesti lisätty tietokantaan. Se tarkistaa, onko objektin tunnus olemassa luodussa kohteeseen ja vastaavatko siinä olevat tiedot tietokantaan lähettämääsi dataa.

Luo kuvauslohko ja lisää seuraava koodi.

kuvaile ("Todo malli", () => {
se("pitäisi luoda todo-kohde onnistuneesti", async () => {
päästää validTodo = {
kohde: "Tiskaa astiat",
valmistunut: väärä,
};
konst newTodo = odottaa Todo (validTodo);
odottaa newTodo.save();
odottaa(uusiTodo._id).määriteltävä();
odottaa(uusiTodo.tuote).olla(validTodo.tuote);
odottaa(uusiTodo.valmis).olla(validTodo.valmis);
});
});

Tämä luo uuden asiakirjan tietokantaan joka sisältää validTodo-muuttujan tiedot. Palautettu objekti tarkistetaan sitten odotettujen arvojen perusteella. Jotta tämä testi läpäisi, palautetulla arvolla tulee olla objektitunnus. Myös kohteen ja täytettyjen kenttien arvojen tulee vastata validTodo-objektin arvoja.

Normaalin käyttötapauksen testaamisen lisäksi sinun on testattava myös epäonnistunut käyttötapaus. Suunnittelemistamme testeistä sinun on testattava mongoose-mallia todo-objektilla, josta puuttuu pakollinen kenttä ja yksi väärällä tyypillä.

Lisää toinen testi samaan kuvauslohkoon seuraavasti:

 se("pitäisi epäonnistua todo-kohdassa ilman pakollisia kenttiä", async () => {
päästää invalidTodo = {
kohde: "Tiskaa astiat",
};
yrittää {
konst newTodo = Uusi Todo (invalidTodo);
odottaa newTodo.save();
} ottaa kiinni (virhe) {
odottaa(virhe).toBeInstanceOf(mungo.Virhe.Validation Error);
odottaa(virhe.virheet.valmis).määriteltävä();
}
});

Todo mangoose -malli odottaa sekä tuotteen että täytetyt kentät. Sen pitäisi antaa virheilmoitus, jos yrität tallentaa tehtävän ilman jotakin näistä kentistä. Tämä testi käyttää try…catch-lohkoa heitetyn virheen havaitsemiseen. Testi odottaa virheiden olevan mongoose-validointivirhe ja johtuvat puuttuvasta täytetystä kentästä.

Voit testata, aiheuttaako malli virheen, jos käytät väärän tyyppisiä arvoja, lisäämällä kuvauslohkoon seuraava koodi.

 se("pitäisi epäonnistua tehtäväkohdassa, jonka kentät ovat väärän tyyppisiä", async () => {
päästää invalidTodo = {
kohde: "Tiskaa astiat",
valmistunut: "Väärä"
};
yrittää {
konst newTodo = Uusi Todo (invalidTodo);
odottaa newTodo.save();
} ottaa kiinni (virhe) {
odottaa(virhe).toBeInstanceOf(mungo.Virhe.Validation Error);
odottaa(virhe.virheet.valmis).määriteltävä();
}
});

Huomaa, että täytetyn kentän arvo on merkkijono loogisen arvon sijaan. Testi odottaa vahvistusvirhettä, koska malli odottaa loogisen arvon.

MongoMemoryServer ja Jest muodostavat loistavan joukkueen

Mongo-memory-server npm -paketti tarjoaa helpon ratkaisun Mongoose-mallien testaamiseen. Voit tallentaa valedataa muistiin koskematta sovelluksesi tietokantaan.

Voit käyttää MongoMemoryServeriä Jestin kanssa testin kirjoittamiseen Mongoose-malleille. Huomaa, että se ei kata kaikkia mahdollisia testejä, joita voit kirjoittaa malleillesi. Nämä testit riippuvat mallistasi.