在 promise 中断言函数调用
Asserting function calls inside a promise
我正在为异步 node.js 函数编写一些测试,该函数 return 是使用 Mocha、Chai 和 Sinon 库的承诺。
假设这是我的功能:
function foo(params) {
return (
mkdir(params)
.then(dir => writeFile(dir))
)
}
mkdir
& writeFile
都是 return 承诺的异步函数。
我需要测试 mkdir
被调用一次 params
给 foo
.
我该怎么做?
我已经看到很多关于如何断言 foo
的整体 return 值的示例(sinon-as-promised 对此非常有帮助),但没有关于如何确保调用单个函数的示例在承诺里面。
也许我忽略了什么,这不是正确的方法?
您可以模拟 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);
});
});
});
mkdir
在这里没有被异步调用,所以测试起来很简单:
mkdir = sinon.stub().resolves("test/dir")
foo(testparams)
assert(mkdir.calledOnce)
assert(mkdir.calledWith(testparams))
…
如果您想测试 writeFile
是否被调用,那只会稍微复杂一些 - 我们必须等待 foo
返回的承诺,然后才能断言:
… // 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"))
…
})
我正在为异步 node.js 函数编写一些测试,该函数 return 是使用 Mocha、Chai 和 Sinon 库的承诺。
假设这是我的功能:
function foo(params) {
return (
mkdir(params)
.then(dir => writeFile(dir))
)
}
mkdir
& writeFile
都是 return 承诺的异步函数。
我需要测试 mkdir
被调用一次 params
给 foo
.
我该怎么做?
我已经看到很多关于如何断言 foo
的整体 return 值的示例(sinon-as-promised 对此非常有帮助),但没有关于如何确保调用单个函数的示例在承诺里面。
也许我忽略了什么,这不是正确的方法?
您可以模拟 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);
});
});
});
mkdir
在这里没有被异步调用,所以测试起来很简单:
mkdir = sinon.stub().resolves("test/dir")
foo(testparams)
assert(mkdir.calledOnce)
assert(mkdir.calledWith(testparams))
…
如果您想测试 writeFile
是否被调用,那只会稍微复杂一些 - 我们必须等待 foo
返回的承诺,然后才能断言:
… // 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"))
…
})