قد يكون اختبار نماذج Mongoose تحديًا لأنك تحتاج إلى كتابة اختبارات لا تتداخل مع قاعدة البيانات الفعلية الخاصة بك. تقدم حزمة خادم ذاكرة MongoDB حلاً مباشرًا. يتيح لك تخزين بيانات الاختبار الخاصة بك في ذاكرة التطبيق.

في هذا البرنامج التعليمي ، ستقوم بإنشاء نموذج Mongoose بسيط وكتابة الاختبارات باستخدام Jest وخادم ذاكرة MongoDB.

ما هو خادم ذاكرة MongoDB؟

آخر شيء تريده هو حفظ البيانات المزيفة في قاعدة البيانات الحقيقية الخاصة بك والتي قد تحدث إذا قمت بالاتصال بها أثناء الاختبار. بدلاً من ذلك ، يمكنك اختيار استخدام مثيل MongoDB محلي منفصل لتخزين بياناتك. بينما يعمل هذا ، فإنه من غير المجدي إذا كانت اختباراتك تعمل على السحابة. علاوة على ذلك ، قد يكون الاتصال والاستعلام عن قاعدة بيانات حقيقية أثناء كل اختبار مكلفًا.

خادم ذاكرة MongoDBومع ذلك ، يقوم بتدوير خادم MongoDB حقيقي ويسمح لك بتخزين بيانات الاختبار في الذاكرة. وهذا يجعله أسرع من استخدام قاعدة بيانات MongoDB محلية لأن البيانات لا تتم كتابتها على قرص فعلي.

إنشاء نموذج النمس

توفر نماذج Mongoose واجهة للتفاعل مع قاعدة بيانات MongoDB. لإنشائها ، تحتاج إلى تجميعها من مخطط النمس ،

instagram viewer
الذي يحدد نموذج بيانات MongoDB الخاص بك. سيستخدم هذا البرنامج التعليمي مخططًا لمستند مهام. سيحتوي على العنوان والحقول المكتملة.

قم بتشغيل الأمر التالي في الجهاز لإنشاء مجلد جديد والانتقال إليه.

اختبار mkdir mongoose-model
قرص مضغوط اختبار النمس النموذجي

قم بتهيئة npm بالأمر التالي:

npm الحرف الأول

ال يرشد العلم إلى npm لإنشاء ملف package.json بقيم افتراضية.

قم بتنفيذ هذا الأمر لتثبيت ملف النمس حزمة:

npm تثبيت النمس

قم بإنشاء ملف جديد يسمى todo.model.js وحدد مخطط المهام:

مقدار ثابت النمس = يتطلب("النمس")
مقدار ثابت {مخطط} = النمس
مقدار ثابت TodoSchema = الجديد مخطط({
العنصر: {
يكتب: سلسلة,
مطلوب: حقيقي
},
مؤلف: {
يكتب: قيمة منطقية,
مطلوب: حقيقي
}
})

في نهاية هذا الملف ، قم بإنشاء نموذج todo وتصديره:

وحدة.صادرات = mongoose.model ("Todo" ، TodoSchema)

التخطيط للاختبارات

عند كتابة الاختبارات ، فأنت تريد التخطيط لما ستختبره مسبقًا. هذا يضمن أنك تختبر جميع وظائف نموذجك.

من نموذج Mongoose الذي أنشأناه ، يجب أن تحتوي المهام على عنصر من النوع String وحقل مكتمل من النوع Boolean. كلا هذين المجالين مطلوبان. هذا يعني ، على الأقل ، أن اختبارنا يجب أن يضمن:

  • تم حفظ العناصر الصالحة بنجاح في قاعدة البيانات.
  • لا يتم حفظ العناصر التي لا تحتوي على الحقول المطلوبة.
  • لا يتم حفظ العناصر ذات الحقول من نوع غير صالح.

سنقوم بكتابة هذه الاختبارات في مجموعة اختبار واحدة لأنها مرتبطة ببعضها البعض. في Jest ، يمكنك تحديد كتلة الاختبار هذه باستخدام الامتداد يصف وظيفة. فمثلا:

يصف('Todo Model Test', () => {
// تذهب اختباراتك هنا
}

إنشاء قاعدة البيانات

لإعداد خادم ذاكرة MongoDB ، ستقوم بإنشاء مثيل خادم ذاكرة Mongo جديد والاتصال بـ Mongoose. ستقوم أيضًا بإنشاء وظائف ستكون مسؤولة عن إسقاط جميع المجموعات في قاعدة البيانات وفصل مثيل خادم ذاكرة Mongo.

قم بتشغيل الأمر التالي للتثبيت خادم الذاكرة mongodb.

npm تثبيت منغودب-ذاكرة-الخادم

قم بإنشاء ملف جديد يسمى setuptestdb.js واستيراد النمس و mongodb-memory-server.

مقدار ثابت النمس = يتطلب("النمس")؛
مقدار ثابت {MongoMemoryServer} = يتطلب("mongodb-memory-server") ؛

بعد ذلك ، قم بإنشاء وظيفة connectDB (). تنشئ هذه الوظيفة مثيلًا جديدًا لخادم ذاكرة Mongo وتتصل بـ Mongoose. ستقوم بتشغيله قبل كل الاختبارات للاتصال بقاعدة بيانات الاختبار.

يترك مونجو = لا شيء;

مقدار ثابت connectDB = غير متزامن () => {
مونجو = انتظر MongoMemoryServer.create () ،
مقدار ثابت uri = mongo.getUri () ؛

انتظر mongoose.connect (uri ، {
useNewUrlParser: حقيقي,
استخدامUnifiedTopology: حقيقي,
});
};

قم بإنشاء دالة dropDB () عن طريق إضافة الكود التالي. تقوم هذه الوظيفة بإسقاط قاعدة البيانات وإغلاق اتصال Mongoose وإيقاف مثيل خادم ذاكرة Mongo. ستقوم بتشغيل هذه الوظيفة بعد انتهاء تشغيل جميع الاختبارات.

مقدار ثابت DropDB = غير متزامن () => {
إذا (مونجو) {
انتظرالنمس.الإتصال.dropDatabase();
انتظرالنمس.الإتصال.أغلق();
انتظر mongo.stop () ،
}
};

الوظيفة الأخيرة التي ستقوم بإنشائها تسمى dropCollections (). يسقط كل مجموعات النمس التي تم إنشاؤها. سوف تقوم بتشغيله بعد كل اختبار.

مقدار ثابت dropCollections = غير متزامن () => {
إذا (مونجو) {
مقدار ثابت مجموعات = انتظر mongoose.connection.db.collections () ؛
إلى عن على (يترك مجموعة من مجموعات) {
انتظر collection.remove () ؛
}
}
};

أخيرًا ، قم بتصدير وظائف conenctDB () و dropDB () و dropCollections ().

وحدة.صادرات = {connectDB، dropDB، dropCollections}

كتابة الاختبارات

كما ذكرنا ، ستستخدم Jest لكتابة الاختبارات. قم بتشغيل الأمر التالي لتثبيت jest.

npm تثبيت دعابة

في ال package.json ملف ، تكوين الدعابة. استبدل مجموعة "البرامج النصية" الحالية بما يلي:

"نصوص": {
"اختبار": "jest --runInBand --detectOpenHandles"
},
"دعابة": {
"اختبار البيئة": "العقدة"
},

قم بإنشاء ملف جديد يسمى todo.model.test.js واستورد مكتبة mongoose ونموذج todo ووظائف conenctDB () و dropDB () و dropCollections ():

مقدار ثابت النمس = يتطلب("النمس")؛
مقدار ثابت {connectDB، dropDB، dropCollections} = يتطلب("./setupdb") ؛
مقدار ثابت تودو = يتطلب("./todo.model") ؛

تحتاج إلى تشغيل وظيفة connectDB () قبل تشغيل جميع الاختبارات. باستخدام Jest ، يمكنك استخدام طريقة beforeAll ().

تحتاج أيضًا إلى تشغيل وظائف التنظيف. بعد كل اختبار ، قم بتشغيل وظيفة dropCollections () ووظيفة dropDB () بعد كل الاختبارات. لست بحاجة إلى القيام بذلك يدويًا ويمكنك استخدام أساليب afterEach () و afterAll () من Jest.

أضف التعليمات البرمجية التالية إلى ملف todo.model.test.js لإعداد قاعدة البيانات وتنظيفها.

قبل كل(غير متزامن () => {
انتظر connectDB () ،
});

بعد كل شيء(غير متزامن () => {
انتظر DropDB () ،
});

بعد كل(غير متزامن () => {
انتظر dropCollections () ،
});

أنت الآن جاهز لإنشاء الاختبارات.

سيتحقق الاختبار الأول مما إذا كان عنصر المهام قد تم إدراجه بنجاح في قاعدة البيانات. سيتحقق مما إذا كان معرف الكائن موجودًا في الإنشاء إلى وما إذا كانت البيانات الموجودة فيه تتطابق مع تلك التي أرسلتها إلى قاعدة البيانات.

إنشاء كتلة وصف وإضافة التعليمات البرمجية التالية.

يصف("نموذج تودو", () => {
هو - هي("يجب إنشاء عنصر المهام بنجاح"، غير متزامن () => {
يترك validTodo = {
العنصر: "اغسل الأطباق",
منجز: خاطئة,
};
مقدار ثابت newTodo = انتظر Todo (validTodo) ؛
انتظر newTodo.save () ،
توقع(newTodo._هوية شخصية).يعرف ب();
توقع(newTodo.العنصر).أن تكون(صالح.العنصر);
توقع(newTodo.منجز).أن تكون(صالح.منجز);
});
});

هذه يقوم بإنشاء مستند جديد في قاعدة البيانات تحتوي على البيانات في متغير validTodo. ثم يتم التحقق من صحة الكائن الذي تم إرجاعه مقابل القيم المتوقعة. لكي ينجح هذا الاختبار ، يجب أن تحتوي القيمة التي تم إرجاعها على معرف كائن. أيضًا ، يجب أن تتطابق القيم الموجودة في العنصر والحقول المكتملة مع تلك الموجودة في الكائن validTodo.

بصرف النظر عن اختبار حالة الاستخدام العادية ، تحتاج أيضًا إلى اختبار حالة الاستخدام الفاشلة. من الاختبارات التي خططنا لها ، تحتاج إلى اختبار نموذج النمس باستخدام كائن todo ، مع وجود حقل مطلوب مفقود وآخر من نوع غير صحيح.

أضف اختبارًا ثانيًا لنفس كتلة الوصف ، على النحو التالي:

 هو - هي("يجب أن تفشل لعنصر المهام دون الحقول المطلوبة"، غير متزامن () => {
يترك alidTodo = {
العنصر: "اغسل الأطباق",
};
محاولة {
مقدار ثابت newTodo = الجديد Todo (غير صالحة) ؛
انتظر newTodo.save () ،
} قبض على (خطأ) {
توقع(خطأ).toBeInstanceOf(النمس.خطأ.خطئ في التحقق);
توقع(خطأ.errors.منجز).يعرف ب();
}
});

يتوقع نموذج نمس Todo كلاً من العنصر والحقول المكتملة. من المفترض أن يحدث خطأ إذا حاولت حفظ المهام بدون أحد هذه الحقول. يستخدم هذا الاختبار كتلة try… catch للإمساك بالخطأ الذي تم إلقاؤه. يتوقع الاختبار أن تكون الأخطاء عبارة عن خطأ نمس في التحقق من الصحة وتنبع من فقدان الحقل المكتمل.

لاختبار ما إذا كان النموذج قد ألقى خطأ إذا كنت تستخدم قيمًا من نوع خاطئ ، أضف الكود التالي إلى كتلة الوصف.

 هو - هي("يجب أن تفشل بالنسبة لعنصر المهام الذي يحتوي على حقول من نوع خاطئ"، غير متزامن () => {
يترك alidTodo = {
العنصر: "اغسل الأطباق",
منجز: "خطأ شنيع"
};
محاولة {
مقدار ثابت newTodo = الجديد Todo (غير صالحة) ؛
انتظر newTodo.save () ،
} قبض على (خطأ) {
توقع(خطأ).toBeInstanceOf(النمس.خطأ.خطئ في التحقق);
توقع(خطأ.errors.منجز).يعرف ب();
}
});

لاحظ أن قيمة الحقل المكتمل عبارة عن سلسلة بدلاً من قيمة منطقية. يتوقع الاختبار أن يتم طرح خطأ في التحقق حيث يتوقع النموذج قيمة منطقية.

MongoMemoryServer و Jest يشكلان فريقًا رائعًا

توفر حزمة npm mongo-memory-server حلاً سهلاً لاختبار نماذج Mongoose. يمكنك تخزين البيانات الوهمية في الذاكرة دون لمس قاعدة بيانات التطبيق الخاص بك.

يمكنك استخدام MongoMemoryServer مع Jest لكتابة اختبارات لنماذج Mongoose. لاحظ أنه لا يغطي جميع الاختبارات الممكنة التي يمكنك كتابتها لنماذجك. ستعتمد هذه الاختبارات على مخططك.