Sinon: الجاسوس thisValue لا يشير إلى المثال عند التجسس المنشئ

تم إنشاؤها على ٩ فبراير ٢٠١٨  ·  10تعليقات  ·  مصدر: sinonjs/sinon

يعمل هذا المقتطف بشكل جيد مع Sinon 2.0.0 ولكنه يفشل مع Sinon 4.2.2:

it('returns correct thisValue', function() {
    window.SomeClass = function() {
        this.counter = 0;
        this.inc = function() {
            this.counter++;
        };
        this.getCounter = function() {
            return this.counter;
        };
    };

    var spy = sinon.spy(window, 'SomeClass');
    var some = new window.SomeClass();
    some.inc();

    expect(spy.thisValues[0].counter).toEqual(1);
    expect(spy.thisValues[0].getCounter()).toEqual(1);
    some.inc();
    expect(spy.thisValues[0].counter).toEqual(2);
    expect(spy.thisValues[0].getCounter()).toEqual(2);
});

يبدو أن الكائن thisValues[0] هو وكيل ولا يشير إلى المثيل الفعلي لـ some .

هذا هو الخطأ في Sinon 4.2.2:

Expected undefined to equal 1
TypeError: undefined is not a function (evaluating 'spy.thisValues[0].getCounter()')
Bug Medium Help wanted Regression hacktoberfest pinned

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

حتى لو لم يتم استخدامه بشكل شائع ، أو على الأقل لم يتم الإبلاغ عنه بشكل شائع ، أود إصلاح هذا الانحدار.

ال 10 كومينتر

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

لا ينبغي أن يكون من الصعب تحويل المثال @ PVince81 المقدم إلى نص اختبار صغير يمكن استخدامه مقابل git bisect run .

إذا كنت لا تعرف كيفية استخدام git bisect ، فهذه فرصة ممتازة لرفع المستوى!

http://www.marclittlemore.com/how-to-find-bugs-using-git-bisect-with-this-easy-guide/

أوه ، أنا أحب التنصيف! سأعتني بهذا ..

ها نحن ذا: 911c498dc14dc4034ba019526bf58f8b24d77da0 يمر الجاسوس عبر الاتصال بـ new (# 1626)

شكرا لفعل ذلك ، @ PVince81! قد يرغب الإصلاح في فحص الرقم 1265 أيضًا ، لأنه يلامس التغييرات اللازمة لدعم تجسس المنشئ.

عندما لا يتم إنشاء كائن باستخدام new ، يتم استدعاء هذه الطريقة ، والتي تغير محتويات thisValue وبالملحق thisValues . في المقابل ، فإن الطريقة التي يتم استدعاؤها عند استخدام جديد تترك thisValue دون تغيير.

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

نظرًا لأنه لا يبدو أن الكثير من الأشخاص قد اشتكوا من هذه المشكلة ، فربما لا يختبر الأشخاص عادةً بهذه الطريقة ولا يستحق الإصلاح العناء (مجرد ملاحظة ، الأمر متروك للمشرفين لاتخاذ القرار)

حتى لو لم يتم استخدامه بشكل شائع ، أو على الأقل لم يتم الإبلاغ عنه بشكل شائع ، أود إصلاح هذا الانحدار.

واجهت نفس المشكلة ، هل هناك أي خطط لإصلاح هذا؟

@ ivan-zakharchuk إذا لم يتطوع أحد ، فلا توجد خطط ، لا. إذا كنت تريد إصلاحه ، فهناك خطوة تالية طبيعية يمكن اتخاذها ؛-)

هذا هو الالتزام المخالف: https://github.com/sinonjs/sinon/issues/1683#issuecomment -364794930

فقط لأقول ، لقد قضيت وقتًا طويلاً في محاولة كتابة إصلاح لهذا ، لكنني لم أنجح. إنه كابوس this . يبدو أن المشكلة الرئيسي يجب أن يكون new جي وظيفة المقدمة هنا بطبيعتها يخلق العلامة التجارية الجديدة this ، في حين thisValues[0] يشير (كما تستخدم في آخر الأصلي) إلى this بواسطة new في الاختبار نفسه (على سبيل المثال var some = new window.SomeClass(); ) - محير للغاية أعرف.

بشكل أساسي ، يعني إصلاح هذا محاولة الحصول عليه في كلا الاتجاهين - استدعاء new يعني تمامًا this ، لكن علينا أن نسميه مرتين (أي واحد في اختبار OP وواحد في proxy-invoke.js ) لإرضاء ES6. لذلك ستنتهي دائمًا بـ this es. الشيء الوحيد الذي كنت أفكر فيه هو ربط الوظائف من this إلى الأخرى ، لكن هذا كان صعبًا للغاية حتى بالنسبة لهذا الأمر وكسر بعض الأشياء الأخرى.

آمل أن يكون ما ورد أعلاه منطقيًا ، فلا تتردد في التصحيح / طلب التوضيح. انظر هنا لتجديد المعلومات حول ما تفعله الكلمة الرئيسية new بالفعل - TLDR تقوم بإنشاء كائن جديد وتجعله this ، أيا كان السياق.

على أي حال ، هناك شيء واحد لاحظته هو أن 911c498 (الالتزام الذي قدم الانحدار) لا يتضمن اختبارًا يغطي المشكلة التي يعالجها - شرط استخدام new مع فئات ES6. ربما يرجع هذا إلى أن خيارات الفحص للاختبارات لا تسمح بالكلمة الأساسية class لأنها تلبي احتياجات ES5 فقط. لدي التزام بإضافة اختبار بحيث لا يؤدي أي إصلاح مستقبلي للمشكلة الحالية إلى إلغاء الإصلاح في 911c498 - يمكنني نشره إذا كان هناك اهتمام.

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