繁体   English   中英

Node.js 和 Jest:测试 promise 循环,计算 function 被调用了多少次

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM