Sinon: مجموعة stubbing الفوري بشكل افتراضي يؤدي إلى سلوك غير مرغوب فيه

تم إنشاؤها على ٧ يناير ٢٠١٦  ·  4تعليقات  ·  مصدر: sinonjs/sinon

لقد لاحظت هذا أثناء محاولتي معرفة سبب تسبب توقف وقت النظام في فشل كتابة csv. اتضح أن المكتبة لديها مكالمة setImmediate تم حظرها: https://github.com/C2FO/fast-csv/blob/master/lib/extended.js#L18

يبدو أن هناك مجموعة من المكتبات التي تعتمد على setImmediate للأشياء غير الضارة ، وأن تزييف setImmediate يؤدي إلى سلوك غير متوقع فيها جميعًا:

ربما يكون من غير المعقول توقع أن توقف وقت النظام لا يؤدي إلى فشل كتابة csv؟ في هذه الحالة ، من الصعب التعقب بشكل خاص ، لأنه في Javascript لا يمكنك فقط الضغط على ctrl+c والحصول على تتبع مكدس يوضح لك الخطأ الذي حدث. استغرق الأمر حوالي 90 دقيقة فقط لتحديد أي جزء من الشفرة كان متجمدًا ، ثم لفهم سبب مسؤولية sinon.

لست متأكدًا مما يجب أن يكون عليه الإصلاح ، ولكن يبدو أنه يؤثر على الكثير من المكتبات ، وقد استجابت واحدة منها على الأقل من خلال إنشاء نسختها الخاصة من setImmediate والتي لا يمكن تشويهها.

إذا كانت الإجابة هي أنني يجب أن أتصل بـ useFakeTimers(0, "Date") ، فربما يجب أن يكون هذا هو الخيار الافتراضي؟ ربما يتناسب ذلك بشكل أفضل مع توقعاتي / توقعات الناس حول كيف يتصرف العالم؟

التعليق الأكثر فائدة

للرجوع إليها في المستقبل ، يتيح لك هذا النموذج من الوظيفة الآن تحديد الوظائف المزيفة:

var clock = sinon.useFakeTimers([now, ]prop1, prop2, ...);

Sets the clock start timestamp and names functions to fake.

Possible functions are setTimeout, clearTimeout, setInterval, clearInterval, setImmediate, clearImmediate and Date. Can also be called without the timestamp.

لذلك أدى هذا إلى حل المشكلة بالنسبة لي عند العمل مع express:

clock = sinon.useFakeTimers(1495020000, 'Date');

ال 4 كومينتر

لست متأكدًا مما يجب أن يكون عليه الإصلاح ، ولكن يبدو أنه يؤثر على الكثير من المكتبات ، وقد استجابت واحدة منها على الأقل من خلال إنشاء نسختها الخاصة من setImmediate التي لا يمكن تشويهها.

هذا هو الحل الموصى به عند استخدام setTimeout ، قم بتعيين فوري لتأثير الحصول على مكدس مكالمات جديد (وليس للتحكم في الوقت).

https://github.com/taylorhakes/promise-polyfill/pull/15

نعم ، لقد أمضيت 90 دقيقة للتو في تشخيص هذا الأمر وإصلاحه في قاعدة بيانات تجارية.

على الأقل ، يجب أن تذكر المستندات أن setImmediate ستكون مزيفة.

للرجوع إليها في المستقبل ، يتيح لك هذا النموذج من الوظيفة الآن تحديد الوظائف المزيفة:

var clock = sinon.useFakeTimers([now, ]prop1, prop2, ...);

Sets the clock start timestamp and names functions to fake.

Possible functions are setTimeout, clearTimeout, setInterval, clearInterval, setImmediate, clearImmediate and Date. Can also be called without the timestamp.

لذلك أدى هذا إلى حل المشكلة بالنسبة لي عند العمل مع express:

clock = sinon.useFakeTimers(1495020000, 'Date');

تشرح الوثائق هذا الآن: http://sinonjs.org/releases/v2.3.2/fake-timers/#var -clock - sinonusefaketimersnow-prop1-prop2-

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات