Sinon: `getStackFrames()[0]` 的问题

创建于 2016-06-12  ·  3评论  ·  资料来源: sinonjs/sinon

我们了解您遇到了问题并且很着急,但请向我们提供一些信息,以便更有可能快速理解、处理和解决您的问题。

  • 诗浓版本: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正在返回一个空数组。

我希望这可能足以让您在没有特定代码示例的情况下继续。 谢谢!

最有用的评论

这可能是一个稍微好一点的版本,也适用于 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 的代码。 你只说诗浓的内部结构,那么外部结构呢? 你想达到什么目的? 如果您添加了更多信息以明确您要实现的目标、如何实现以及哪些不起作用,则可以重新打开它。

我可以在 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 );
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

sudhirbits picture sudhirbits  ·  4评论

fearphage picture fearphage  ·  4评论

akdor1154 picture akdor1154  ·  4评论

NathanHazout picture NathanHazout  ·  3评论

OscarF picture OscarF  ·  4评论