Sinon: Problème avec `getStackFrames()[0]`

Créé le 12 juin 2016  ·  3Commentaires  ·  Source: sinonjs/sinon

Nous comprenons que vous avez un problème et que vous êtes pressé, mais veuillez nous fournir quelques informations pour qu'il soit beaucoup plus probable que votre problème soit compris, traité et résolu rapidement.

  • Sinon version : 1.17.4
  • Environnement : Firefox
  • Exemple d'URL :
  • Autres bibliothèques que vous utilisez : moka, chai

Que vous attendiez-vous à ce qu'il se passe?

Je m'attendais à ce que ma propre erreur soit signalée, pas une erreur interne Sinon.

Que se passe-t-il réellement

Une erreur Sinon interne s'affiche.

Comment reproduire

Décrire _avec du code_ comment reproduire le comportement défectueux,
ou un lien vers le code sur JSBin ou similaire

Voir ceci pour un exemple

Dans sinon/lib/sinon/call.js , ce code me donne l'erreur que this.getStackFrames(...)[0] is undefined :

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

De ce qui suit :

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

... il semble que le slice renvoie un tableau vide.

J'espère que cela vous suffira pour continuer sans un exemple de code spécifique. Merci!

Commentaire le plus utile

C'est peut-être une version légèrement meilleure qui fonctionne également dans 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 );

Tous les 3 commentaires

Ce n'est pas suffisant. Je ne vois aucun code utilisant l'API de Sinon. Vous venez de mentionner les internes de Sinon, mais qu'en est-il des externes ? Qu'essayez-vous d'atteindre ? Vous pouvez rouvrir ceci si vous ajoutez plus d'informations qui indiquent clairement ce que vous essayez d'accomplir, comment et ce qui ne fonctionne pas.

Je suis capable de reproduire cela dans Chrome 55.0.2883.95 pour Mac avec Sinon 1.17.6 (le dernier disponible sur http://sinonjs.org/).

Voici un JSBin avec un cas de test réduit : http://jsbin.com/mufotihiwo/edit?js ,console,output

Essentiellement, il semble que lorsqu'un stub est passé sans point à Promise#then() , Sinon _pense_ qu'il devrait avoir une trace de pile de plus de 3 lignes, mais ce n'est pas le cas.

Je n'ai pas encore eu l'occasion de comprendre exactement ce qui cause cela.

Je pense que c'est parce que le rappel est invoqué directement par la machine virtuelle, ce qui signifie qu'il n'y a rien dans la pile. Ainsi, lorsque Sinon coupe les 3 premières lignes (à partir de spy.invoke() ), il ne reste plus rien. Ensuite, le String#replace() dans call.toString échoue car getStackFrames()[0] est undefined .

Je pense qu'une stratégie d'atténuation consisterait simplement à mettre un chèque défensif dans toString() qui ressemble à quelque chose comme :

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

C'est peut-être une version légèrement meilleure qui fonctionne également dans 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 );
Cette page vous a été utile?
0 / 5 - 0 notes