Sinon: "TypeError: لا يمكن قراءة الخاصية 'now' من غير معرف" عند sinon.useFakeTimers ()

تم إنشاؤها على ٥ يوليو ٢٠١٨  ·  15تعليقات  ·  مصدر: sinonjs/sinon

صف الخلل
باستخدام 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

السياق (يرجى استكمال المعلومات التالية):

  • إصدار المكتبة: 6.1.0
  • البيئة: أوبونتو 16.04
  • مثال URL:
  • المكتبات الأخرى التي تستخدمها:

    • "vue": "^ 2.5.16"،

    • "vue-router": "^ 3.0.1"

    • "@ vue / cli-plugin-babel": "^ 3.0.0-beta.15"،

    • "@ vue / cli-plugin-eslint": "^ 3.0.0-beta.15"،

    • "@ vue / cli-plugin-unit-mocha": "^ 3.0.0-beta.15"،

    • "@ vue / cli-service": "^ 3.0.0-beta.15"،

    • "@ vue / eslint-config-airbnb": "^ 3.0.0-rc.3"،

    • "@ vue / test-utils": "^ 1.0.0-beta.16"،

    • "تشاي": "^ 4.1.2"،

    • "vue-template-compiler": "^ 2.5.16"

    • موكا 5.2.0

    • حزمة الويب Webpack 4.15.1

Help wanted stale

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

mroderick لقد قمت بإنشاء sinon.useFakeTimers ، لا أعرف ما إذا كان هذا هو نوع واجهة برمجة التطبيقات التي تفكر فيها ، لذا لا تتردد في تقديم أي ملاحظات !

ال 15 كومينتر

نفس المشكلة مع [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 ، يرجى نشر تقرير مشكلة. تم إصلاح هذه المشكلة.

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