Sinon: مشكلة في `getStackFrames () [0]`

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

نحن نتفهم أن لديك مشكلة وأنك في عجلة من أمرك ، ولكن يرجى تزويدنا ببعض المعلومات لزيادة احتمالية فهم مشكلتك والعمل عليها وحلها بسرعة.

  • إصدار Sinon: 1.17.4
  • البيئة: Firefox
  • مثال URL:
  • المكتبات الأخرى التي تستخدمها: mocha، chai

ماذا تتوقع أن يحدث؟

كنت أتوقع أن يتم الإبلاغ عن خطأي ، وليس خطأ Sinon الداخلي.

ما يحدث بالفعل

يظهر خطأ Sinon داخلي.

كيف تتكاثر

صف _ مع الكود_ كيفية إعادة إنتاج السلوك الخاطئ ،
أو الارتباط بكود على JSBin أو ما شابه

انظر هذا للحصول على مثال

في sinon/lib/sinon/call.js ، يعطيني هذا الرمز الخطأ الذي يفيد بأن this.getStackFrames(...)[0] is undefined :

      if (this.stack) {
            callStr += this.getStackFrames()[0].replace(/^\s*(?:at\s+|@)?/, " at ");
      }

مما يلي:

    getStackFrames: function () {
        // Omit the error message and the two top stack frames in sinon itself:
        return this.stack && this.stack.split("\n").slice(3);
    },

... يبدو أن slice يقوم بإرجاع مصفوفة فارغة.

آمل أن يكون هذا كافيًا لك للاستمرار بدون عينة رمز محددة. شكرا!

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

ربما يكون هذا إصدارًا أفضل قليلاً يعمل أيضًا في Node:

let sinon = require('sinon');

function test() {

  let stub1 = sinon.stub().returns( Promise.resolve({}) );
  let stub2 = sinon.stub();

  function run() {
    return stub1().then( stub2 );
  }

  run()
  .then( () => sinon.assert.calledTwice( stub2 ) )
  .catch( console.log );

}

setTimeout( test, 0 );

ال 3 كومينتر

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

يمكنني إعادة إنتاج هذا في Chrome 55.0.2883.95 لنظام التشغيل Mac باستخدام Sinon 1.17.6 (أحدث إصدار متوفر على http://sinonjs.org/).

إليك JSBin مع حالة اختبار مخفضة: http://jsbin.com/mufotihiwo/edit؟js ، وحدة التحكم ، الإخراج

بشكل أساسي ، يبدو أنه عندما يتم تمرير كعب بدون نقطة إلى Promise#then() ، يعتقد Sinon _ أنه يجب أن يكون له تتبع مكدس أطول من 3 أسطر ، لكنه لا يفعل ذلك.

لم تتح لي الفرصة بعد لمعرفة أسباب ذلك بالضبط.

أعتقد أن هذا بسبب استدعاء رد الاتصال مباشرة بواسطة VM ، مما يعني أنه لا يوجد شيء في المكدس. لذلك عندما يقطع Sinon الأسطر الثلاثة الأولى (بدءًا من spy.invoke() ) ، لم يتبق شيء. ثم يفشل String#replace() في call.toString لأن getStackFrames()[0] هو undefined .

أعتقد أن استراتيجية التخفيف تتمثل في وضع شيك دفاعي في toString() يبدو شيئًا مثل:

callStr += ( this.getStackFrames()[0] || 'unknown function' ).replace(/^\s*(?:at\s+|@)?/, " at ");

ربما يكون هذا إصدارًا أفضل قليلاً يعمل أيضًا في Node:

let sinon = require('sinon');

function test() {

  let stub1 = sinon.stub().returns( Promise.resolve({}) );
  let stub2 = sinon.stub();

  function run() {
    return stub1().then( stub2 );
  }

  run()
  .then( () => sinon.assert.calledTwice( stub2 ) )
  .catch( console.log );

}

setTimeout( test, 0 );
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات