صف الخلل
باستخدام sinon @ 6.1.0 عندما أفعل sinon.useFakeTimers()
- حصلت على خطأ:
TypeError: Cannot read property 'now' of undefined
at mirrorDateProperties (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:3644:1)
at hijackMethod (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:3947:1)
at Object.install (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:4337:1)
at useFakeTimers (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:4385:1)
at Sandbox.useFakeTimers (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:15390:1)
at Context.<anonymous> (dist/webpack:/tests/unit/Countdown.spec.js:23:1)
عندما رجعت إلى sinon @ 5 - كل شيء على ما يرام!
الريبو الخاص بي:
https://github.com/moraveyo/chess-clock/blob/bf764f3ed9026366de9375bbc870109e4f007099/tests/unit/Countdown.spec.js#L23
السياق (يرجى استكمال المعلومات التالية):
نفس المشكلة مع [email protected]
: محبط:
[email protected]
يعمل كما هو متوقع
ظاهرة غريبة. لقد حاولت تكرار هذا باستخدام مشروع Vanilla Angular و Sinon 6.1.0 ، لكن useFakeTimers () لا تسبب لي أي أخطاء ، لذلك قد يكون شيئًا ما في بيئة المشروع نفسها.
من رسالة الخطأ ، أعتقد أن هذا المتغير يصبح غير محدد بطريقة ما.
moraveyo هل تعتقد أنه يمكنك بسيط يوضح المشكلة؟
يحتوي Stack Overflow على دليل حول كيفية إنشاء مثال بسيط وكامل وقابل للتحقق
ليس لدي الكثير من الوقت لذلك الآن ، آسف.
mroderick لقد واجهت للتو هذه المشكلة اليوم. هنا مستودع صغير يكرر المشكلة: هنا .
يحتاج الخطأ إلى كل من webpack
و jsdom
للظهور. يُظهر تتبع المكدس وبعض عمليات التصحيح ظهور المشكلة عندما يحاول lolex
الوصول إلى _global.Date
والذي لا يبدو أنه تم تعيينه على window
إنشاؤه بواسطة jsdom
.
LouisBrunner شكرًا لك على إنشاء حالة اختبار قابلة للتشغيل يسهل فهمها 👍
تشغيل الاختبار مع test:node
في المستودع الخاص بك ، فإنه يفشل كما هو متوقع.
عندما أقوم بإجراء الاختبار باستخدام mocha
، فإنه يمر بالشكل المتوقع.
السطر الذي فشل هو lolex-src.js # L131 ، تمامًا كما
كما استنتجت ، فإن السبب الأساسي لذلك هو أن الكائن window
المقدم من jsdom
لا يوفر كائن Date
. يحتاج lolex
إلى أن يكون قادرًا على الإشارة إلى النطاق العام لكي يعمل بشكل صحيح ، لذلك لا يمكننا إجراء تغييرات والإشارة إلى Date
مباشرة.
lolex
على دعم لسيناريو JSDOM ، تحقق من lolex.withGlobal
// create a lolex implementation using node's `global`
const lolex = require("lolex").withGlobal(global);
const clock = lolex.install();
setTimeout(fn, 15); // Schedules with clock.setTimeout
clock.uninstall();
يمكننا بالتأكيد تحسين lolex
لإلقاء خطأ وصفي عندما لا يتم استيفاء افتراضاته حول النطاق العالمي ، ونقترح أن المؤلف يستخدم withGlobal
. هل ترغب في المساهمة في طلب سحب لذلك؟
mroderick سعيد لقد ساعد المثال! 😃
سأكون سعيدًا لإنشاء علاقات عامة ، ولكن هذا سيصلح فقط lolex
. هل هناك أي طريقة للحصول على sinon.useFakeTimers
للعمل في هذا السيناريو؟ ربما عن طريق إضافة وسيطة مثل global
إلى useFakeTimers
يمكن استخدامها لاستدعاء withGlobal
داخليًا؟
هل هناك أي تحديثات جديدة حول الحصول على sinon.useFakeTimers
للعمل في هذا السيناريو. ما زلت أحصل على هذا الاستثناء عند استخدام mocha في jsDom
Error: The global scope doesn't have a `Date` object (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)
LouisBrunner تعجبني هذه الفكرة ، أعتقد أن الحل سيعمل مع معظم الناس 👍
mroderick لقد قمت بإنشاء sinon.useFakeTimers
، لا أعرف ما إذا كان هذا هو نوع واجهة برمجة التطبيقات التي تفكر فيها ، لذا لا تتردد في تقديم أي ملاحظات !
تم وضع علامة على هذه المشكلة تلقائيًا على أنها قديمة نظرًا لعدم وجود نشاط حديث لها. سيتم إغلاقه إذا لم يحدث أي نشاط آخر. شكرا لمساهماتكم.
تم إصلاح ذلك بالرقم # 1935
أنا أستخدم sinon 7.2.7 وعندما أحاول استخدام sinon.useFakeTimers()
حصلت على:
TypeError: Cannot set property performance of #<Window> which has only a getter
نفس الشيء.
هل يمكن أن تكون بابل 7؟ https://github.com/babel/babel/issues/8363
@ cichy380 و axelhunn ، يرجى نشر تقرير مشكلة. تم إصلاح هذه المشكلة.
التعليق الأكثر فائدة
mroderick لقد قمت بإنشاء
sinon.useFakeTimers
، لا أعرف ما إذا كان هذا هو نوع واجهة برمجة التطبيقات التي تفكر فيها ، لذا لا تتردد في تقديم أي ملاحظات !