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.
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.