Мы понимаем, что у вас возникла проблема, и вы очень спешите, но, пожалуйста, предоставьте нам некоторую информацию, чтобы с большей вероятностью вы могли понять, проработать и быстро решить вашу проблему.
- Версия 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
возвращает пустой массив.
Я надеюсь, что этого может быть достаточно, чтобы вы могли продолжить работу без конкретного образца кода. Спасибо!
Этого недостаточно. Я вообще не вижу кода, использующего 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 );
Самый полезный комментарий
Возможно, это немного лучшая версия, которая также работает в Node: