Sinon: Проблема с `getStackFrames () [0]`

Созданный на 12 июн. 2016  ·  3Комментарии  ·  Источник: sinonjs/sinon

Мы понимаем, что у вас возникла проблема, и вы очень спешите, но, пожалуйста, предоставьте нам некоторую информацию, чтобы с большей вероятностью вы могли понять, проработать и быстро решить вашу проблему.

  • Версия Sinon: 1.17.4
  • Окружающая среда: Firefox
  • Пример URL:
  • Другие библиотеки, которые вы используете: mocha, chai

Чего вы ожидали?

Я ожидал, что будет сообщено о моей собственной ошибке, а не о внутренней ошибке Sinon.

Что на самом деле происходит

Отображается внутренняя ошибка Sinon.

Как воспроизвести

Опишите _с помощью кода_, как воспроизвести неправильное поведение,
или ссылка на код на JSBin или аналогичном

См. Это для примера

В sinon/lib/sinon/call.js этот код выдает ошибку this.getStackFrames(...)[0] is undefined :

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

Из следующего:

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

... похоже, что slice возвращает пустой массив.

Я надеюсь, что этого может быть достаточно, чтобы вы могли продолжить работу без конкретного образца кода. Спасибо!

Самый полезный комментарий

Возможно, это немного лучшая версия, которая также работает в 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 );

Все 3 Комментарий

Этого недостаточно. Я вообще не вижу кода, использующего Sinon API. Вы просто упомянули внутреннее устройство Sinon, а как насчет внешнего? Чего вы пытаетесь достичь? Вы можете открыть его снова, если добавите дополнительную информацию, которая проясняет, чего вы пытаетесь достичь, как и что не работает.

Я могу воспроизвести это в Chrome 55.0.2883.95 для Mac с Sinon 1.17.6 (последняя версия доступна на http://sinonjs.org/).

Вот JSBin с сокращенным тестовым примером: http://jsbin.com/mufotihiwo/edit?js , console, output

По сути, кажется, что когда заглушка передается без точек в Promise#then() , Sinon _thinks_ должна иметь трассировку стека длиннее 3 строк, но это не так.

У меня еще не было возможности выяснить, что именно вызывает это.

Я считаю, что это связано с тем, что обратный вызов вызывается непосредственно виртуальной машиной, а это означает, что в стеке ничего нет. Поэтому, когда Синон отрезает первые 3 строки (начиная с spy.invoke() ), ничего не остается. Тогда String#replace() в call.toString терпит неудачу, потому что getStackFrames()[0] - это undefined .

Я _ думаю_, что стратегией смягчения будет просто поставить защитный чек в toString() который выглядит примерно так:

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

Возможно, это немного лучшая версия, которая также работает в 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 );
Была ли эта страница полезной?
0 / 5 - 0 рейтинги