如何为非返回/并行异步函数创建存根/间谍?

时间:2017-11-29 23:51:56

标签: javascript promise sinon stub spy

在这个例子中,barStub.called === false,大概是因为fooStub的执行流程不等待barStub解析。

我还将assert(barStub.called)置于10秒的setTimeout中,但它仍未被调用。

有没有办法存根像bar这样的方法?

const sinon = require('sinon')
const assert = require('assert')

const functionHolder2 = {
  bar: function() {
    return Promise.resolve('bar')
  }
}

const functionHolder = {
  foo: function() {
    functionHolder2.bar()

    return Promise.resolve('foo')
  }
}

const fooStub = sinon.stub(functionHolder, 'foo').returns(Promise.resolve({}))
const barStub = sinon.stub(functionHolder2, 'bar').returns(Promise.resolve({}))

functionHolder.foo()

assert(fooStub.called) // this passes
assert(barStub.called) // this fails

1 个答案:

答案 0 :(得分:0)

这里的问题是stub取代了你正在使用的函数的功能。

这意味着当您将foo存根以返回承诺时,它会完全取代原来的foo函数。

你需要做的是spy foo,它会保留原有的功能和流量,同时让你知道它是否已被调用以及被调用了多少次等。

bar的实际存根是正确的 - 只是存根永远不会被调用。

您想要什么(包括等待foo来电完成):

const sinon = require('sinon');
const assert = require('assert')

const functionHolder2 = {
  bar: function() {
    return Promise.resolve('bar')
  }
}

const functionHolder = {
  foo: function() {
    functionHolder2.bar()

    return Promise.resolve('foo')
  }
}

const fooStub = sinon.spy(functionHolder, 'foo')
const barStub = sinon.stub(functionHolder2, 'bar').returns(Promise.resolve({}))

functionHolder.foo().then(() => {
  assert(fooStub.called)
  assert(barStub.called)
});

文档链接:http://sinonjs.org/releases/v4.1.2/spies/