Sinon: Menghentikan, dan memulihkan tidak berfungsi dengan instance kelas es6

Dibuat pada 14 Okt 2015  ·  31Komentar  ·  Sumber: sinonjs/sinon

Lingkungan Hidup:

  • simpul 4.2.1
  • Sinon 1.15.4
  • Menulis sintaks es6 yang didukung secara asli, tanpa transpiler.

    Kasus cobaan:

'use strict';
const sinon = require('sinon');

class C {
  foo(){ }
}

const c = new C();

const sandbox = sinon.sandbox.create();

sandbox.stub(c);
sandbox.restore();
sandbox.stub(c);
sandbox.restore();

Hasil yang diharapkan:

Tidak ada kesalahan, kode dijalankan dan ada dengan bersih.

Hasil nyata:

TypeError: Attempted to wrap foo which is already wrapped
    at checkWrappedMethod (/Users/erin.noe-payne/local/lr-zmq/node_modules/sinon/lib/sinon/util/core.js:81:29)
    at Object.wrapMethod (/Users/erin.noe-payne/local/lr-zmq/node_modules/sinon/lib/sinon/util/core.js:121:21)
    at stub (/Users/erin.noe-payne/local/lr-zmq/node_modules/sinon/lib/sinon/stub.js:67:26)
    at /Users/erin.noe-payne/local/lr-zmq/node_modules/sinon/lib/sinon/stub.js:60:25
    at /Users/erin.noe-payne/local/lr-zmq/node_modules/sinon/lib/sinon/walk.js:26:26
    at Array.forEach (native)
    at walkInternal (/Users/erin.noe-payne/local/lr-zmq/node_modules/sinon/lib/sinon/walk.js:23:45)
    at Object.walk (/Users/erin.noe-payne/local/lr-zmq/node_modules/sinon/lib/sinon/walk.js:46:20)
    at Object.stub (/Users/erin.noe-payne/local/lr-zmq/node_modules/sinon/lib/sinon/stub.js:52:23)
    at Object.stub (/Users/erin.noe-payne/local/lr-zmq/node_modules/sinon/lib/sinon/collection.js:106:49)

Info lebih lanjut:

  • Menghentikan dan memulihkan setiap fungsi secara manual berfungsi: sinon.stub(c, 'foo'); c.foo.restore();
  • Menggunakan sinon.stub dan sinon.restore alih-alih kotak pasir tidak berfungsi - gagal dengan masalah yang sama, saya berasumsi dengan akar penyebab yang sama
1.x 2.x Medium Documentation ES2015+ Help wanted Needs investigation

Semua 31 komentar

Harap tingkatkan ke Sinon 1.17 terbaru di mana ini akan berfungsi.

Ini tidak berfungsi di 1.17. Saya sebenarnya menggunakan 1.17.1 - Saya salah membaca package.json saya.

Anda dapat menjalankan kode yang disediakan di sinon terbaru dan mengamati masalahnya.

Saya perhatikan bahwa https://github.com/sinonjs/sinon/pull/870 belum dirilis. Kita perlu memotong 1.17.2 untuk mengirimkan perbaikan ini. @mroderick Bisakah saya meminta Anda melakukan rilis itu? Saya masih tidak melihat bagaimana proses rilis bekerja sekarang :meringis:

Tentu, saya bisa memeriksanya akhir pekan ini

[email protected] sekarang diterbitkan ke npm

@autoric maukah Anda menguji dengan versi itu?

Akan mengintegrasikan dan menguji hari ini. Terima kasih banyak atas dukungannya!

@mroderick Saya tidak melihat perubahan dengan masalah dalam kode produksi saya.

Selanjutnya, menjalankan test case sederhana yang disediakan untuk masalah ini terus menghasilkan kesalahan yang sama. Apakah Anda melihatnya berjalan dengan sukses?

Sama di sini .... masalah yang sama untuk saya juga dengan es6.

+1

Untuk semua orang yang mengalami hal ini, Anda harus membantu kami dan mencoba pra-rilis Sinon 2. Kami menganggapnya sudah cukup siap, tetapi mungkin ada hal-hal yang belum dapat kami lihat yang tersembunyi di bawah permukaan. Cobalah seperti ini:

npm install sinon<strong i="6">@next</strong>

... dan gunakan pelacak masalah untuk masalah apa pun yang Anda temui. Harus memperbaiki ini dan beberapa masalah lainnya.

Hebat akan melakukannya @fatso83 . Saya menganggap API yang ada sebagian besar akan berlaku di berikutnya. Jika tidak, apakah Anda memiliki dokumen v2 di suatu tempat?

Semua pengembangan saat ini pada master adalah untuk versi 2. Versi 1 dalam mode pemeliharaan. API sebagian besar akan disimpan, kecuali untuk beberapa perubahan yang melanggar yang didokumentasikan dalam pelacak masalah (jangan ingat masalah di atas kepala saya).

@mantoni Kami tidak memiliki perbaikan untuk ini di cabang master dan v1.17 : bug masih ada, jadi ini pasti sesuatu selain #867/#868. Saya menempelkan skrip pengujian di atas ke 878-test.js dan menjalankan node 878-test.js . Mendapat kesalahan yang sama persis seperti dalam deskripsi kasus.

Hei, Baru saja mengalami masalah ini. Mungkinkah terkait dengan fakta bahwa metode kelas ES6 tidak dapat dihitung dan karenanya tidak muncul di for...in dll?

Untuk versi 2.0.0 dimungkinkan untuk mematikan kelas ES2016. Berikut ini ada postingan tentang cara membuatnya:
https://eirikardal.no/stubbing-es2015-classes-with-sinon/

@Menda Anda salah mengira bug ini untuk sesuatu yang lain :-) Posting ini adalah tentang mematikan _instances_ kelas, bukan kelas itu sendiri. Stubbing kelas ES6 telah dibahas secara luas sebelumnya (lihat #831 dan #1035). Jadi untuk pendatang baru yang ingin tahu tentang itu, silakan baca dan pahami utas ini tentang masalah serupa. Ini mungkin menjelaskan apa yang Anda coba lakukan.

Utas pada dasarnya mengatakan hal yang sama dengan artikel, yang omong-omong tidak ada hubungannya dengan Sinon 2.0. Memata-matai dan mematikan kelas ES6 sama-sama mungkin (dan tidak mungkin - tergantung pada apa yang ingin Anda lakukan) dengan Sinon 1.x. Baca komentar saya jika Anda ingin ringkasan singkat tentang cara melakukan berbagai hal di ES6, termasuk contoh dengan kode.

Terima kasih @fatso83. Saya benar-benar mencampuradukkan hal-hal, saya buruk!

Saya hanya ingin mengonfirmasi v2/next menyelesaikan kesalahan "Mencoba membungkus .." untuk saya!

@ fatso83 Saya tidak mengerti apakah ada cara untuk mematikan metode kelas ES6, dan masih memiliki masalah yang sama

@davidtzoor Tidak ada yang istimewa tentang kelas ES6 dibandingkan dengan kelas ES5. Itu hanya gula sintaksis. Anda masih memiliki prototipe _object_. Metode instans rintisan cara apa pun yang Anda lakukan dengan kelas ES5.

class FooClass{
  static classMethod(){}
  instanceMethod(){}
}

tidak lain adalah ini

function FooClass(){}
FooClass.classMethod = function(){}
FooClass.prototype.instanceMethod = function(){}

Jadi, jika Anda ingin mematikan metode kelas, cukup matikan metode pada objek kelas dan bukan pada instance:

const stub = sinon.stub(FooClass, 'classMethod').returns('mystub');

Mengenai Sinon 2 ini tidak secara resmi keluar, tetapi dapat digunakan apa adanya. Jika Anda telah membaca utas ini, Anda akan melihat saya mengomentari ini dan bagaimana cara mendapatkan pra-rilis

Saya tidak bisa membuatnya bekerja

Ditutup karena kesalahan, maaf.

Saya baru saja menguji ini di cabang master dengan contoh yang sama persis seperti yang dijelaskan pada posting pertama dan tes lulus. Saya tidak yakin apakah saya melakukan ini di cabang yang salah atau semacamnya, tetapi ini adalah kode yang saya jalankan:

it.only("should work with ES6 classes", function () {
    class C {
      foo(){ }
    }

    const c = new C();

    const sandbox = sinonSandbox.create();

    sandbox.stub(c);
    sandbox.restore();
    sandbox.stub(c);
    sandbox.restore();
});

Dan sepertinya berjalan tanpa masalah.

@lucasfcosta , terima kasih telah meluangkan waktu untuk memeriksanya! Menutup ini sebagai tetap.

@JoeChapman , coba milis atau ruang obrolan Gitter.

@lucasfcosta apakah Anda juga menguji mematikan metode dari instance kelas yang ada?

@davidtzoor Saya tahu Anda bertanya bagaimana melakukannya sebelumnya, jadi apakah langkah-langkah yang diuraikan gagal berfungsi?

Saya sebenarnya sedang berlibur, jadi tidak dapat memeriksa sekarang bertanya-tanya apakah
Anda sudah memeriksa itu. Akan dilakukan minggu depan, terima kasih!

Bekerja. Menghentikan properti fungsi adalah kasus penggunaan paling dasar untuk Sinon. Menyebutnya metode kelas statis tidak mengubah apa pun tentang mekanisme :-)

Sunting: terlalu mudah untuk mengirim komentar secara tidak sengaja di ponsel saya ..

Menemukan masalah ini hari ini. Kode yang tepat berfungsi untuk semua tes kecuali dalam satu file. membuatku gila. lol. akan mencoba membuat kasus uji untuk direproduksi.

Pikir saya keliru membuka kembali ini tanpa memperhatikan ketika berkomentar beberapa minggu yang lalu.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat