Μπορεί να είναι μια πρόκληση να δοκιμάσετε μοντέλα Mongoose επειδή πρέπει να γράψετε δοκιμές που δεν παρεμβαίνουν στην πραγματική βάση δεδομένων σας. Το πακέτο διακομιστή μνήμης MongoDB προσφέρει μια απλή λύση. Σας επιτρέπει να αποθηκεύετε τα δεδομένα της δοκιμής σας στη μνήμη της εφαρμογής.

Σε αυτό το σεμινάριο, θα δημιουργήσετε ένα απλό μοντέλο Mongoose και θα γράψετε δοκιμές χρησιμοποιώντας το Jest και τον διακομιστή μνήμης MongoDB.

Τι είναι ο διακομιστής μνήμης MongoDB;

Το τελευταίο πράγμα που θέλετε είναι να αποθηκεύσετε πλαστά δεδομένα στην πραγματική βάση δεδομένων σας, κάτι που μπορεί να συμβεί εάν συνδεθείτε σε αυτό κατά τη διάρκεια της δοκιμής. Αντίθετα, μπορείτε να επιλέξετε να χρησιμοποιήσετε μια ξεχωριστή τοπική παρουσία MongoDB για την αποθήκευση των δεδομένων σας. Ενώ αυτό λειτουργεί, είναι ανέφικτο εάν οι δοκιμές σας εκτελούνται στο cloud. Επιπλέον, η σύνδεση και η αναζήτηση μιας πραγματικής βάσης δεδομένων κατά τη διάρκεια κάθε δοκιμής μπορεί να είναι ακριβή.

Διακομιστής μνήμης MongoDB

instagram viewer
, ωστόσο, περιστρέφει έναν πραγματικό διακομιστή MongoDB και σας επιτρέπει να αποθηκεύσετε τα δεδομένα δοκιμής στη μνήμη. Αυτό το καθιστά πιο γρήγορο από τη χρήση μιας τοπικής βάσης δεδομένων MongoDB, καθώς τα δεδομένα δεν είναι γραμμένα σε φυσικό δίσκο.

Δημιουργώντας το μοντέλο Mongoose

Τα μοντέλα Mongoose παρέχουν μια διεπαφή για διασύνδεση με τη βάση δεδομένων MongoDB. Για να τα δημιουργήσετε, πρέπει να τα μεταγλωττίσετε από ένα σχήμα Mongoose, που καθορίζει το μοντέλο δεδομένων MongoDB. Αυτό το σεμινάριο θα χρησιμοποιήσει ένα σχήμα για ένα έγγραφο υποχρεώσεων. Θα περιέχει τον τίτλο και τα συμπληρωμένα πεδία.

Εκτελέστε την ακόλουθη εντολή στο τερματικό για να δημιουργήσετε έναν νέο φάκελο και μεταβείτε σε αυτόν.

mkdir mongoose-model-test
CD μαγκούστα-μοντέλο-δοκιμή

Εκκινήστε το npm με την ακόλουθη εντολή:

npm init -y

ο Το flag δίνει εντολή στο npm να δημιουργήσει ένα αρχείο package.json με προεπιλεγμένες τιμές.

Εκτελέστε αυτήν την εντολή για να εγκαταστήσετε το μαγκούστα πακέτο:

npm εγκαθιστώ μαγκούστα

Δημιουργήστε ένα νέο αρχείο που ονομάζεται todo.model.js και ορίστε το σχήμα εργασίας:

συνθ μαγκούστα = απαιτώ("μαγκούστα")
συνθ { Schema } = μαγκούστα
συνθ TodoSchema = νέος Σχήμα({
στοιχείο: {
τύπος: Σειρά,
απαιτείται: αληθής
},
ολοκληρώθηκε: {
τύπος: Boolean,
απαιτείται: αληθής
}
})

Στο τέλος αυτού του αρχείου, δημιουργήστε και εξάγετε το μοντέλο εργασίας:

μονάδα μέτρησης.εξαγωγές = mongoose.model("Todo", TodoSchema)

Σχεδιασμός των Δοκιμών

Όταν γράφετε τεστ, θέλετε να σχεδιάσετε τι θα δοκιμάσετε εκ των προτέρων. Αυτό διασφαλίζει ότι δοκιμάζετε όλη τη λειτουργικότητα του μοντέλου σας.

Από το μοντέλο Mongoose που δημιουργήσαμε, το todo πρέπει να περιέχει ένα στοιχείο τύπου String και ένα ολοκληρωμένο πεδίο τύπου Boolean. Και τα δύο αυτά πεδία είναι υποχρεωτικά. Αυτό σημαίνει ότι, τουλάχιστον, η δοκιμή μας θα πρέπει να διασφαλίζει:

  • Τα έγκυρα στοιχεία αποθηκεύονται με επιτυχία στη βάση δεδομένων.
  • Τα στοιχεία χωρίς υποχρεωτικά πεδία δεν αποθηκεύονται.
  • Τα στοιχεία με πεδία μη έγκυρου τύπου δεν αποθηκεύονται.

Θα γράψουμε αυτές τις δοκιμές σε ένα μπλοκ δοκιμών αφού σχετίζονται. Στο Jest, ορίζετε αυτό το μπλοκ δοκιμής χρησιμοποιώντας το περιγράφω λειτουργία. Για παράδειγμα:

περιγράφω('Todo Model Test', () => {
// Οι δοκιμές σας πηγαίνουν εδώ
}

Ρύθμιση της βάσης δεδομένων

Για να ρυθμίσετε έναν διακομιστή μνήμης MongoDB, θα δημιουργήσετε ένα νέο παράδειγμα διακομιστή μνήμης Mongo και θα συνδεθείτε στο Mongoose. Θα δημιουργήσετε επίσης συναρτήσεις που θα είναι υπεύθυνες για την απόρριψη όλων των συλλογών στη βάση δεδομένων και την αποσύνδεση από την παρουσία του διακομιστή μνήμης Mongo.

Εκτελέστε την ακόλουθη εντολή για εγκατάσταση mongodb-memory-server.

npm εγκαθιστώ mongodb-μνήμη-υπηρέτης

Δημιουργήστε ένα νέο αρχείο που ονομάζεται setuptestdb.js και εισάγετε mongoose και mongodb-memory-server.

συνθ μαγκούστα = απαιτώ("μαγκούστα");
συνθ { MongoMemoryServer } = απαιτώ("mongodb-memory-server");

Στη συνέχεια, δημιουργήστε μια συνάρτηση connectDB(). Αυτή η λειτουργία δημιουργεί ένα νέο παράδειγμα διακομιστή μνήμης Mongo και συνδέεται με το Mongoose. Θα το εκτελέσετε πριν από όλες τις δοκιμές για να συνδεθείτε στη βάση δεδομένων δοκιμής.

αφήνω mongo = μηδενικό;

συνθ connectDB = ασυγχρονισμός () => {
mongo = αναμένω MongoMemoryServer.create();
συνθ uri = mongo.getUri();

αναμένω mongoose.connect (uri, {
useNewUrlParser: αληθής,
useUnifiedTopology: αληθής,
});
};

Δημιουργήστε μια συνάρτηση dropDB() προσθέτοντας τον ακόλουθο κώδικα. Αυτή η συνάρτηση απορρίπτει τη βάση δεδομένων, κλείνει τη σύνδεση Mongoose και διακόπτει την παρουσία του διακομιστή μνήμης Mongo. Θα εκτελέσετε αυτήν τη λειτουργία αφού ολοκληρωθεί η εκτέλεση όλων των δοκιμών.

συνθ dropDB = ασυγχρονισμός () => {
αν (μονγκό) {
αναμένωμαγκούστα.σύνδεση.dropDatabase();
αναμένωμαγκούστα.σύνδεση.Κλείσε();
αναμένω mongo.stop();
}
};

Η τελευταία συνάρτηση που θα δημιουργήσετε ονομάζεται dropCollections(). Καταρρίπτει όλες τις δημιουργημένες συλλογές Mongoose. Θα το εκτελείτε μετά από κάθε δοκιμή.

συνθ dropCollections = ασυγχρονισμός () => {
αν (μονγκό) {
συνθ συλλογές = αναμένω mongoose.connection.db.collections();
Για (αφήνω συλλογή του συλλογές) {
αναμένω collection.remove();
}
}
};

Τέλος, εξάγετε τις συναρτήσεις conenctDB(), dropDB() και dropCollections().

μονάδα μέτρησης.εξαγωγές = {connectDB, dropDB, dropCollections}

Συγγραφή των Τεστ

Όπως αναφέρθηκε, θα χρησιμοποιήσετε το Jest για να γράψετε τα τεστ. Εκτελέστε την ακόλουθη εντολή για να εγκαταστήσετε το αστείο.

npm εγκαθιστώ αστείο

Στο πακέτο.json αρχείο, διαμόρφωση αστείο. Αντικαταστήστε το υπάρχον μπλοκ "σενάρια" με τα εξής:

"σενάρια": {
"δοκιμή": "αστεία --runInBand --detectOpenHandles"
},
"αστείο": {
"testΠεριβάλλον": "κόμβος"
},

Δημιουργήστε ένα νέο αρχείο που ονομάζεται todo.model.test.js και εισάγετε τη βιβλιοθήκη mongoose, το μοντέλο todo και τις συναρτήσεις conenctDB(), dropDB() και dropCollections():

συνθ μαγκούστα = απαιτώ("μαγκούστα");
συνθ { connectDB, dropDB, dropCollections } = απαιτώ("./setupdb");
συνθ Todo = απαιτώ("./todo.model");

Πρέπει να εκτελέσετε τη συνάρτηση connectDB() πριν εκτελεστούν όλες οι δοκιμές. Με το Jest, μπορείτε να χρησιμοποιήσετε τη μέθοδο beforeAll().

Πρέπει επίσης να εκτελέσετε λειτουργίες καθαρισμού. Μετά από κάθε δοκιμή, εκτελέστε τη συνάρτηση dropCollections() και τη συνάρτηση dropDB() μετά από όλες τις δοκιμές. Δεν χρειάζεται να το κάνετε χειροκίνητα και μπορείτε να χρησιμοποιήσετε μεθόδους afterEach() και afterAll() από το Jest.

Προσθέστε τον ακόλουθο κώδικα στο αρχείο todo.model.test.js για να ρυθμίσετε και να καθαρίσετε τη βάση δεδομένων.

πριν από όλα (ασυγχρονισμός () => {
αναμένω connectDB();
});

μετά από όλα (ασυγχρονισμός () => {
αναμένω dropDB();
});

μετά από κάθε (ασυγχρονισμός () => {
αναμένω dropCollections();
});

Τώρα είστε έτοιμοι να δημιουργήσετε τα τεστ.

Η πρώτη δοκιμή θα ελέγξει εάν το αντικείμενο todo εισήχθη με επιτυχία στη βάση δεδομένων. Θα ελέγξει εάν το αναγνωριστικό αντικειμένου υπάρχει στο που δημιουργήθηκε και εάν τα δεδομένα σε αυτό ταιριάζουν με αυτά που στείλατε στη βάση δεδομένων.

Δημιουργήστε ένα μπλοκ περιγραφής και προσθέστε τον ακόλουθο κώδικα.

περιγράφω("Todo Model", () => {
το("θα πρέπει να δημιουργήσει ένα αντικείμενο με επιτυχία", ασύγχρονο () => {
αφήνω validTodo = {
είδος: "Πλένω τα πιάτα",
ολοκληρώθηκε το: ψευδής,
};
συνθ newTodo = αναμένω Todo (validTodo);
αναμένω newTodo.save();
αναμένω(newTodo._ταυτότητα).να καθορίζονται();
αναμένω(newTodo.είδος).να είναι(validTodo.είδος);
αναμένω(newTodo.ολοκληρώθηκε το).να είναι(validTodo.ολοκληρώθηκε το);
});
});

Αυτό δημιουργεί ένα νέο έγγραφο στη βάση δεδομένων που περιέχει τα δεδομένα στη μεταβλητή validTodo. Το επιστρεφόμενο αντικείμενο στη συνέχεια επικυρώνεται έναντι των αναμενόμενων τιμών. Για να περάσει αυτή η δοκιμή, η επιστρεφόμενη τιμή θα πρέπει να έχει αναγνωριστικό αντικειμένου. Επίσης, οι τιμές στο αντικείμενο και στα συμπληρωμένα πεδία θα πρέπει να ταιριάζουν με αυτές στο αντικείμενο validTodo.

Εκτός από τη δοκιμή της κανονικής περίπτωσης χρήσης, πρέπει επίσης να δοκιμάσετε μια περίπτωση χρήσης που αποτυγχάνει. Από τις δοκιμές που σχεδιάσαμε, πρέπει να δοκιμάσετε το μοντέλο μαγκούστας με ένα αντικείμενο todo, με ένα υποχρεωτικό πεδίο που λείπει και ένα με λανθασμένο τύπο.

Προσθέστε μια δεύτερη δοκιμή στο ίδιο μπλοκ περιγραφής, ως εξής:

 το("θα πρέπει να αποτύχει για το αντικείμενο χωρίς υποχρεωτικά πεδία", ασύγχρονο () => {
αφήνω invalidTodo = {
είδος: "Πλένω τα πιάτα",
};
προσπαθήστε {
συνθ newTodo = νέος Todo (invalidTodo);
αναμένω newTodo.save();
} σύλληψη (λάθος) {
αναμένω(λάθος).toBeInstanceOf(μαγκούστα.Λάθος.ValidationError);
αναμένω(λάθος.Σφάλματα.ολοκληρώθηκε το).να καθορίζονται();
}
});

Το μοντέλο Todo mongoose αναμένει τόσο το αντικείμενο όσο και τα συμπληρωμένα πεδία. Θα πρέπει να παρουσιάσει ένα σφάλμα εάν προσπαθήσετε να αποθηκεύσετε μια εργασία χωρίς ένα από αυτά τα πεδία. Αυτή η δοκιμή χρησιμοποιεί το μπλοκ try…catch για να συλλάβει το πεταχθέν σφάλμα. Η δοκιμή αναμένει ότι τα σφάλματα θα είναι σφάλμα επικύρωσης μαγκούστας και προέρχονται από το συμπληρωμένο πεδίο που λείπει.

Για να ελέγξετε εάν το μοντέλο παρουσιάζει σφάλμα εάν χρησιμοποιείτε τιμές λανθασμένου τύπου, προσθέστε τον ακόλουθο κώδικα στο μπλοκ περιγραφής.

 το("θα πρέπει να αποτύχει για το αντικείμενο με πεδία λανθασμένου τύπου", ασύγχρονο () => {
αφήνω invalidTodo = {
είδος: "Πλένω τα πιάτα",
ολοκληρώθηκε το: "Ψευδής"
};
προσπαθήστε {
συνθ newTodo = νέος Todo (invalidTodo);
αναμένω newTodo.save();
} σύλληψη (λάθος) {
αναμένω(λάθος).toBeInstanceOf(μαγκούστα.Λάθος.ValidationError);
αναμένω(λάθος.Σφάλματα.ολοκληρώθηκε το).να καθορίζονται();
}
});

Σημειώστε ότι η τιμή του συμπληρωμένου πεδίου είναι μια συμβολοσειρά αντί για boolean. Η δοκιμή αναμένει ότι θα εμφανιστεί ένα σφάλμα επικύρωσης καθώς το μοντέλο αναμένει μια δυαδική τιμή.

Ο MongoMemoryServer και το Jest δημιουργούν μια εξαιρετική ομάδα

Το πακέτο mongo-memory-server npm παρέχει μια εύκολη λύση για τη δοκιμή μοντέλων Mongoose. Μπορείτε να αποθηκεύσετε εικονικά δεδομένα στη μνήμη χωρίς να αγγίξετε τη βάση δεδομένων της εφαρμογής σας.

Μπορείτε να χρησιμοποιήσετε το MongoMemoryServer με το Jest για να γράψετε δοκιμές για μοντέλα Mongoose. Σημειώστε ότι δεν καλύπτει όλα τα πιθανά τεστ που μπορείτε να γράψετε για τα μοντέλα σας. Αυτές οι δοκιμές θα εξαρτηθούν από το σχήμα σας.