![](/img/trans.png)
[英]Multiple resolve() calls inside promise returning async function
[英]Asserting function calls inside a promise
我正在为async node.js函数编写一些测试,它使用Mocha,Chai和Sinon库返回一个promise。
让我们说这是我的功能:
function foo(params) {
return (
mkdir(params)
.then(dir => writeFile(dir))
)
}
mkdir
和writeFile
都是返回promise的异步函数。
我需要测试mkdir
被赋予foo
的params
调用一次。
我怎样才能做到这一点?
我已经看到了很多关于如何断言foo
的整体返回值的例子( sinon-as-promised对此非常有帮助),但不是关于如何确保在promise中调用各个函数。
也许我忽视了一些东西,这不是正确的方法吗?
mkdir
在这里不是异步调用的,因此测试它是相当简单的:
mkdir = sinon.stub().resolves("test/dir")
foo(testparams)
assert(mkdir.calledOnce)
assert(mkdir.calledWith(testparams))
…
如果你想测试writeFile
被调用,那只是稍微复杂一点 - 我们必须在断言之前等待foo
返回的promise:
… // mdir like above
writeFile = sinon.stub().resolves("result")
return foo(testparams).then(r => {
assert.strictEqual(r, "result")
assert(writeFile.calledOnce)
assert(writeFile.calledWith("test/dir"))
…
})
您可以模拟mkdir
函数,然后使用setTimeout
检查是否调用了此函数。
describe('foo', () => {
it('should call mkdir', () => {
return new Promise((resolve, reject) => {
let originalFunction = mkdir;
let timer = setTimeout(() => {
reject(`mkdir has not been called`);
});
mkdir = (...params) => new Promise(mkdirResolve => {
//restore the original method as soon as it is invoked
mkdir = originalMethod;
clearTimeout(timer);
mkdirResolve(someExpectedData);
resolve();
});
foo(params);
});
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.