كيفية الاستهزاء بشكل صحيح Moment.js / التواريخ في Jest

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

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

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

قد يبدو الاختبار المبدئي لمكون TodayIntro:

ومع ذلك ، سيفشل هذا الاختبار في أي يوم لا يكون في 23 يناير. أحد الحلول لهذا هو تجاوز وظيفة تاريخ Javascript لإرجاع تاريخ معروف للعمل ضده عند كتابة الاختبارات.

يتجاوز هذا الرمز مُنشئ التاريخ لتعيين تاريخ ثابت "حالي" ثابت:

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

طرق لضبط الوقت الثابت والمنطقة الزمنية لـ Jest / JS

  1. استخدم مكتبة لسخر كائن Date لإرجاع تاريخ ثابت ومنطقة زمنية (نوصي باستخدام MockDate للحالات البسيطة ، ولكن اقرأ للحصول على تفاصيل عن البدائل)
  2. لحظة وهمية (). format () لإرجاع سلسلة ثابتة
  3. استهزاء منشئ التاريخ و now () دالة لإرجاع وقت ثابت

يُفضل استخدام مكتبة في هذه الحالة نظرًا لأن هذه المكتبات تم اختبارها جيدًا ، ولا تقدم رمزًا متداولًا وتعامل بشفافية مع إمكانية إنشاء التواريخ في كلتا الحالتين (Date.now () مقابل التاريخ الجديد () وما إلى ذلك). بالإضافة إلى ذلك ، يسمح استخدام مكتبة باتباع رمز الاختبار بسهولة وتحديد وقت معين لكل اختبار والذي يسمح بممارسات اختبار أفضل.

  • يوفر MockDate وظائف إضافية للمناطق الزمنية وسهل الاستخدام
  • sinon يوفر التاريخ والوقت (setTimeout الخ) يسخر
  • يمكن أن يكون إعداد النموذج مفيدًا في بيئات محدودة ، ومع ذلك ، قد يصبح معقدًا إلى حد ما
  • الياسمين (غير مضمن في المزاح) ، يأتي مع jasmine.clock ()

تستخدم الأمثلة أدناه MockDate ، والذي يركز فقط على الاستهزاء بالكائن Date ببساطة ويتناول اختبار إزاحة المنطقة الزمنية وكذلك لاختبار تحويل المنطقة الزمنية المحلية.

اختبار اللقطة ، أيضًا ، سهل الاختبار بالتواريخ الساخرة:

نظرًا لأن الإنزيم عبارة عن مكتبة رائعة ، فإن هذا الإنزيم مثال ضحل:

كيفية (أفضل) اختبار تاريخ المنطق

التواريخ لديها الكثير من الحالات حافة والمنطق وراءها. عند اختبار التواريخ ، تأكد من تغطية حالات الحافة وليس فقط تعيين تاريخ محدد واحد للاختبار والمتابعة. يمكن أن تختلف التواريخ أيضًا وفقًا للمنطقة والمنطقة الزمنية.

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

فيما يلي بعض الافتراضات غير الصحيحة والضمنية حول التواريخ:

  1. كل العملاء موجودون في منطقة زمنية واحدة ووقت التوقيت الصيفي
  2. جميع العملاء موجودون في المنطقة الزمنية للمطور
  3. طول اسم الشهر مشابه نسبيًا
  4. ساعات الخادم دائما صحيحة
  5. يعرف الخادم إعدادات المنطقة الزمنية / العميل

يفترض هذا الاختبار أن الخادم يكون دائمًا في المنطقة الزمنية الصحيحة وأنه تم تعيين المنطقة الزمنية بشكل صحيح. بدلاً من ذلك ، قم بتعيين المنطقة الزمنية وتأكد من مطابقة التاريخ للمنطقة الزمنية المحلية بشكل صحيح.

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

التطلع إلى المستقبل: تاريخ تخزين الوقت والتصميم

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

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

تنطبق هذه النصائح والأساليب على أكثر من مجرد اختبار Javascript & Jest للتواريخ والأوقات. كما أنها تعمل في سياق NodeJS وبمعنى عام حول الأشياء الرئيسية التي يجب اختبارها في الأنظمة التي تتعامل مع التاريخ والوقت بشكل عام. في العديد من الحالات ، يعد تخزين الوقت على الخادم في التوقيت العالمي المنسق (UTC) ثم التحويل إلى المنطقة الزمنية المحلية بناءً على إعدادات العميل / المستعرض مثاليًا. إذا تعذر الوصول إلى العميل ، فإن تخزين كل من التوقيت العالمي المنسق (UTC) والمنطقة الزمنية الفعلية للمستخدم هو وسيلة فعالة لمعالجة التواريخ والأوقات باستمرار.