Sinon: Masalah dengan `getStackFrames()[0]`

Dibuat pada 12 Jun 2016  ·  3Komentar  ·  Sumber: sinonjs/sinon

Kami memahami bahwa Anda memiliki masalah dan sedang terburu-buru, tetapi harap berikan beberapa info kepada kami agar masalah Anda dapat dipahami, diselesaikan, dan diselesaikan dengan cepat.

  • Versi Sinon : 1.17.4
  • Lingkungan: Firefox
  • Contoh URL:
  • Pustaka lain yang Anda gunakan: mocha, chai

Apa yang Anda harapkan terjadi?

Saya berharap kesalahan saya sendiri akan dilaporkan, bukan kesalahan Sinon internal.

Apa yang sebenarnya terjadi?

Kesalahan Sinon internal ditampilkan.

Cara memperbanyak

Jelaskan _dengan kode_ cara mereproduksi perilaku yang salah,
atau tautan ke kode di JSBin atau yang serupa

Lihat ini untuk contoh

Dalam sinon/lib/sinon/call.js , kode ini memberi saya kesalahan bahwa this.getStackFrames(...)[0] is undefined :

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

Dari berikut ini:

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

...tampaknya slice mengembalikan array kosong.

Saya berharap ini cukup bagi Anda untuk melanjutkan tanpa contoh kode tertentu. Terima kasih!

Komentar yang paling membantu

Ini mungkin versi yang sedikit lebih baik yang juga berfungsi di 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 );

Semua 3 komentar

Ini tidak cukup. Saya tidak melihat kode apa pun yang menggunakan API Sinon sama sekali. Anda baru saja menyebutkan bagian dalam Sinon, tapi bagaimana dengan bagian luarnya? Apa yang ingin Anda capai? Anda dapat membuka kembali ini jika Anda menambahkan lebih banyak info yang memperjelas apa yang ingin Anda capai, bagaimana, dan apa yang tidak berhasil.

Saya dapat mereproduksi ini di Chrome 55.0.2883.95 untuk Mac dengan Sinon 1.17.6 (terbaru tersedia di http://sinonjs.org/).

Inilah JSBin dengan test case yang dikurangi: http://jsbin.com/mufotihiwo/edit?js ,console,output

Pada dasarnya, sepertinya ketika sebuah rintisan diteruskan tanpa titik ke Promise#then() , Sinon _thinks_ seharusnya memiliki jejak tumpukan lebih dari 3 baris, tetapi tidak.

Saya belum memiliki kesempatan untuk mencari tahu persis apa yang menyebabkan ini.

Saya percaya ini karena panggilan balik dipanggil langsung oleh VM, yang berarti tidak ada apa pun di tumpukan. Jadi ketika Sinon memotong 3 baris pertama (mulai dari spy.invoke() ), tidak ada yang tersisa. Kemudian String#replace() di call.toString gagal karena getStackFrames()[0] adalah undefined .

Saya _berpikir_ strategi mitigasinya adalah dengan memberikan tanda centang defensif di toString() yang terlihat seperti:

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

Ini mungkin versi yang sedikit lebih baik yang juga berfungsi di 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 );
Apakah halaman ini membantu?
0 / 5 - 0 peringkat