我们了解您遇到了问题并且很着急,但请向我们提供一些信息,以便更有可能快速理解、处理和解决您的问题。
- 诗浓版本:1.17.4
- 环境:火狐
- 示例网址:
- 您正在使用的其他库: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 的代码。 你只说诗浓的内部结构,那么外部结构呢? 你想达到什么目的? 如果您添加了更多信息以明确您要实现的目标、如何实现以及哪些不起作用,则可以重新打开它。
我可以在 Chrome 55.0.2883.95 for Mac 中使用 Sinon 1.17.6(最新版本可在 http://sinonjs.org/ 获得)重现这个。
这是一个带有简化测试用例的 JSBin: http ://jsbin.com/mufotihiwo/edit?js ,console,output
从本质上讲,似乎当存根被无点传递给Promise#then()
,Sinon _thinks_ 它应该具有超过 3 行的堆栈跟踪,但事实并非如此。
我还没有机会弄清楚究竟是什么原因造成的。
我相信这是因为回调是由 VM 直接调用的,这意味着堆栈中没有任何内容。 因此,当 Sinon 砍掉前 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: