Sinon: Problem mit `getStackFrames()[0]`

Erstellt am 12. Juni 2016  ·  3Kommentare  ·  Quelle: sinonjs/sinon

Wir verstehen, dass Sie ein Problem haben und es eilig haben, aber bitte geben Sie uns einige Informationen, damit Ihr Problem besser verstanden, bearbeitet und schnell gelöst werden kann.

  • Sinon-Version: 1.17.4
  • Umgebung: Firefox
  • Beispiel-URL:
  • Andere Bibliotheken, die Sie verwenden: Mokka, Chai

Was haben Sie erwartet?

Ich habe erwartet, dass mein eigener Fehler gemeldet wird, kein interner Sinon-Fehler.

Was passiert eigentlich

Ein interner Sinon-Fehler wird angezeigt.

So reproduzieren Sie

Beschreiben Sie _mit Code_, wie Sie das fehlerhafte Verhalten reproduzieren können,
oder Link zum Code auf JSBin oder ähnlichem

Sehen Sie sich dies als Beispiel an

In sinon/lib/sinon/call.js gibt mir dieser Code den Fehler, dass this.getStackFrames(...)[0] is undefined :

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

Aus folgendem:

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

...es scheint, dass slice ein leeres Array zurückgibt.

Ich hoffe, dass dies für Sie ausreicht, um ohne ein bestimmtes Codebeispiel fortzufahren. Danke!

Hilfreichster Kommentar

Dies ist vielleicht eine etwas bessere Version, die auch in Node funktioniert:

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 );

Alle 3 Kommentare

Dies ist nicht ausreichend. Ich sehe überhaupt keinen Code, der die API von Sinon verwendet. Sie erwähnen nur das Innere von Sinon, aber was ist mit dem Äußeren? Was versuchst du zu erreichen? Sie können dies erneut öffnen, wenn Sie weitere Informationen hinzufügen, die deutlich machen, was Sie erreichen möchten, wie und was nicht funktioniert.

Ich kann dies in Chrome 55.0.2883.95 für Mac mit Sinon 1.17.6 reproduzieren (die neueste Version ist unter http://sinonjs.org/ verfügbar).

Hier ist eine JSBin mit einem reduzierten Testfall: http://jsbin.com/mufotihiwo/edit?js ,console,output

Im Wesentlichen scheint es so, als ob Sinon, wenn ein Stub punktfrei an Promise#then() , _denkt_, dass er einen Stack-Trace haben sollte, der länger als 3 Zeilen ist, aber das tut er nicht.

Ich hatte noch keine Gelegenheit herauszufinden, woran das liegt.

Ich glaube, das liegt daran, dass der Rückruf direkt von der VM aufgerufen wird, was bedeutet, dass sich nichts im Stack befindet. Wenn Sinon also die ersten 3 Zeilen abschneidet (beginnend bei spy.invoke() ), ist nichts mehr übrig. Dann schlägt das String#replace() in call.toString fehl, weil getStackFrames()[0] undefined .

Ich _glaube_, eine Abschwächungsstrategie wäre, einfach einen defensiven Check in toString() , der in etwa so aussieht:

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

Dies ist vielleicht eine etwas bessere Version, die auch in Node funktioniert:

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 );
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen