如何为 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)
});

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