[英]Node.js and Jest: Testing promise loop, count how many times function has been called
我想使用 JEST 测试我的代码,但我遇到了一些问题。 我想检查是否已调用restart()
function。
我的代码是这样工作的,它正在等待数据,如果没有数据,它会再次调用相同的 function。 基本上就像一个循环。
我的代码.js 文件:
module.exports = {
getSomething: async () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("");
}, 1000);
});
},
doSomething: async () => {
const data = await module.exports.getSomething();
if (!data) {
return module.exports.restart();
}
return data;
},
restart: async () => {
return module.exports.doSomething();
}
};
myCode.test.js 文件:
const myCode = require("./exampleCode")
describe("test", () => {
test("Is it doing something more than once?", async () => {
const restartSpy = jest.spyOn(myCode, 'restart');
myCode.doSomething()
expect(restartSpy).toHaveBeenCalledTimes(1);
})
})
我的问题是expect(restartSpy).toHaveBeenCalledTimes(1);
正在返回假。
问题是 - 我做错了什么? 有没有办法测试这段代码?
这里的主要问题是在myCode.doSomething()
之前缺少await
。 你所有的函数都是异步的,所以你需要在检查间谍之前等待它们完成:
await myCode.doSomething();
另一个问题是它是一个无限递归循环 - 如果您不修改调用restart
的代码,jest 将在 5000 毫秒(默认情况下)后超时,例如:
doSomething: async (restartCounter = 0) => {
const data = await module.exports.getSomething();
if (!data && ++restartCounter < 2) {
return module.exports.restart(restartCounter);
}
return data;
},
restart: async (restartCounter) => {
return module.exports.doSomething(restartCounter);
}
实际上,我找到了解决方法。
describe("test", () => {
test("Is it doing something more than once?", async () => {
myCode.restart = jest.fn()
const restartSpy = jest.spyOn(myCode, 'restart');
await myCode.doSomething()
expect(restartSpy).toHaveBeenCalledTimes(1);
})
})
我正在覆盖restart()
function。所以现在,我可以将await
添加到doSomething()
function,它将不再是无限循环。 现在我可以检查重启 function 是否被调用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.