Sinon: Nilai ini mata-mata tidak menunjuk ke contoh saat memata-matai konstruktor

Dibuat pada 9 Feb 2018  ·  10Komentar  ·  Sumber: sinonjs/sinon

Cuplikan ini berfungsi dengan baik dengan Sinon 2.0.0 tetapi gagal dengan 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);
});

Sepertinya objek thisValues[0] adalah proxy dan tidak merujuk ke instance sebenarnya dari some .

Ini adalah kesalahan dengan 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

Komentar yang paling membantu

Meskipun tidak umum digunakan, atau setidaknya tidak umum dilaporkan, saya ingin regresi ini diperbaiki.

Semua 10 komentar

Ini adalah kandidat yang baik untuk menggunakan git bisect untuk menetapkan kapan perilakunya diubah, yang mungkin memberikan beberapa petunjuk apakah perubahan itu disengaja (fitur) atau tidak (bug).

Seharusnya tidak terlalu sulit untuk mengubah contoh @ PVince81 yang diberikan menjadi skrip pengujian kecil yang dapat digunakan untuk git bisect run .

Jika Anda tidak tahu cara menggunakan git bisect , ini adalah kesempatan bagus untuk naik level!

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

Oh, saya suka membagi dua! Aku akan urus ini ..

Ini dia: 911c498dc14dc4034ba019526bf58f8b24d77da0 Spy melewati panggilan dengan new (# 1626)

Terima kasih telah melakukannya, @ PVince81! Sebuah perbaikan mungkin juga ingin memeriksa # 1265, karena menyentuh perubahan mana yang diperlukan untuk mendukung mata-mata konstruktor.

Ketika sebuah objek tidak dibuat dengan new , metode ini dipanggil, yang mengubah konten thisValue dan dengan ekstensi thisValues . Sebaliknya, metode yang dipanggil saat baru digunakan menyisakan thisValue tidak berubah.

Mengingat bahwa kode kami hanya memiliki satu penggunaan ini, saya lebih suka tergoda untuk pergi ke rute cepat dan mengubah tes tunggal kami yang memicu ini karena saya tidak punya waktu untuk membungkus kepala saya di sekitar internal sinon dan tidak merasa memenuhi syarat untuk membuat perubahan yang berpotensi merusak

karena tidak banyak orang yang mengeluh tentang masalah ini, mungkin orang biasanya tidak menguji dengan cara ini dan perbaikan tidak sepadan (hanya observasi, terserah pengelola untuk memutuskan)

Meskipun tidak umum digunakan, atau setidaknya tidak umum dilaporkan, saya ingin regresi ini diperbaiki.

Mengalami masalah yang sama, apakah ada rencana untuk memperbaikinya?

@ ivan-zakharchuk Jika tidak ada yang menjadi sukarelawan, tidak ada rencana, tidak. Jika Anda ingin memperbaikinya, ada langkah alami berikutnya yang dapat diambil ;-)

Ini adalah komit yang melanggar: https://github.com/sinonjs/sinon/issues/1683#issuecomment -364794930

Sekadar mengatakan, saya telah menghabiskan waktu lama mencoba menulis perbaikan untuk ini, tetapi tidak berhasil. Ini mimpi buruk dari nilai this . Masalah inti tampaknya adalah bahwa new ing fungsi yang disediakan di sini secara inheren menciptakan this , sedangkan thisValues[0] (seperti yang digunakan dalam posting asli) mengacu pada this dibuat oleh new dalam pengujian itu sendiri (yaitu var some = new window.SomeClass(); ) - sangat membingungkan saya tahu.

Pada dasarnya, memperbaiki ini berarti mencoba memiliki dua cara - memanggil new benar-benar berarti this , tetapi kita harus memanggilnya dua kali (yaitu satu dalam pengujian OP dan satu lagi di proxy-invoke.js ) untuk memenuhi ES6. Jadi, Anda selalu akan mendapatkan dua this es. Satu-satunya hal yang terpikir oleh saya adalah mengikat fungsi dari satu this ke yang lain, tetapi itu terlalu rumit bahkan untuk ini dan merusak beberapa hal lainnya.

Saya harap penjelasan di atas masuk akal, silakan mengoreksi / meminta klarifikasi. Lihat di sini untuk penyegaran tentang apa yang sebenarnya dilakukan kata kunci new - TLDR membuat objek baru dan menjadikannya this , apa pun konteksnya.

Bagaimanapun, satu hal yang saya perhatikan adalah bahwa 911c498 (komit yang memperkenalkan regresi) tidak menyertakan tes yang mencakup masalah yang dialaminya - persyaratan untuk menggunakan new dengan kelas ES6. Ini mungkin karena opsi linting untuk pengujian tidak mengizinkan kata kunci class karena opsi tersebut hanya melayani ES5. Saya memiliki komitmen untuk menambahkan tes sehingga perbaikan apa pun di masa mendatang untuk masalah saat ini tidak membatalkan perbaikan di 911c498 - Saya dapat melakukan PR jika ada minat.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat