Sinon: Problema con `getStackFrames () [0]`

Creado en 12 jun. 2016  ·  3Comentarios  ·  Fuente: sinonjs/sinon

Entendemos que tiene un problema y tiene prisa, pero bríndenos información para que sea mucho más probable que comprendamos, trabajemos y resuelva su problema rápidamente.

  • Versión Sinon: 1.17.4
  • Entorno: Firefox
  • URL de ejemplo:
  • Otras bibliotecas que está utilizando: mocha, chai

Qué esperabas que sucediera?

Esperaba que se informara mi propio error, no un error interno de Sinon.

Lo que realmente pasa

Se muestra un error interno de Sinon.

Como reproducir

Describe _con código_ cómo reproducir el comportamiento defectuoso,
o enlace al código en JSBin o similar

Vea esto para un ejemplo

En sinon/lib/sinon/call.js , este código me da el error de que this.getStackFrames(...)[0] is undefined :

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

De lo siguiente:

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

... parece que slice devuelve una matriz vacía.

Espero que esto sea suficiente para que continúe sin una muestra de código específica. ¡Gracias!

Comentario más útil

Esta es quizás una versión ligeramente mejor que también funciona en 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 );

Todos 3 comentarios

Esto no es suficiente. No veo ningún código usando la API de Sinon en absoluto. Solo mencionas los aspectos internos de Sinon, pero ¿qué pasa con los externos? ¿Qué estás tratando de lograr? Puede volver a abrir esto si agrega más información que aclare qué está tratando de lograr, cómo y qué no funciona.

Puedo reproducir esto en Chrome 55.0.2883.95 para Mac con Sinon 1.17.6 (el último disponible en http://sinonjs.org/).

Aquí hay un JSBin con un caso de prueba reducido: http://jsbin.com/mufotihiwo/edit?js , console, output

Esencialmente, parece que cuando un código auxiliar se pasa sin puntos a Promise#then() , Sinon _ piensa_ debería tener un seguimiento de pila de más de 3 líneas, pero no es así.

Todavía no he tenido la oportunidad de averiguar exactamente qué causa esto.

Creo que esto se debe a que la VM invoca directamente la devolución de llamada, lo que significa que no hay nada en la pila. Entonces, cuando Sinon corta las primeras 3 líneas (comenzando en spy.invoke() ), no queda nada. Entonces el String#replace() en call.toString falla porque getStackFrames()[0] es undefined .

Creo que una estrategia de mitigación sería simplemente poner un cheque defensivo en toString() que se parezca a:

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

Esta es quizás una versión ligeramente mejor que también funciona en 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 );
¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

OscarF picture OscarF  ·  4Comentarios

andys8 picture andys8  ·  4Comentarios

zimtsui picture zimtsui  ·  3Comentarios

fearphage picture fearphage  ·  3Comentarios

ALeschinsky picture ALeschinsky  ·  4Comentarios