在这个例子中,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
答案 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)
});