如何为 non-returned/parallel 异步函数创建 stub/spy?
how do you create a stub/spy for an non-returned/parallel asynchronous function?
在这个例子中,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
这里的问题是 stub
替换了您正在存根的函数的功能。
这意味着当您将 foo
存根到 return 承诺时,它完全取代了原始的 foo
功能。
您需要做的是 spy
on 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)
});
在这个例子中,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
这里的问题是 stub
替换了您正在存根的函数的功能。
这意味着当您将 foo
存根到 return 承诺时,它完全取代了原始的 foo
功能。
您需要做的是 spy
on 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)
});