首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >NodeJS - Jest单元测试setTimeout中的process.on回调

NodeJS - Jest单元测试setTimeout中的process.on回调
EN

Stack Overflow用户
提问于 2017-09-29 17:43:11
回答 1查看 3.8K关注 0票数 9

我试图在我的process.on('SIGTERM')回调中使用Jest对计时器进行单元测试,但它似乎从未被调用过。我使用的是jest.useFakeTimers(),虽然它确实在一定程度上模拟了setTimeout调用,但在检查它时,它并没有在setTimeout.mock对象中结束。

我的index.js文件:

代码语言:javascript
代码运行次数:0
运行
复制
process.on('SIGTERM', () => {
    console.log('Got SIGTERM');

    setTimeout(() => {
        console.log('Timer was run');
    }, 300);
});

setTimeout(() => {
    console.log('Timer 2 was run');
}, 30000);

以及测试文件:

代码语言:javascript
代码运行次数:0
运行
复制
describe('Test process SIGTERM handler', () => {
    test.only('runs timeout', () => {
        jest.useFakeTimers();
        process.exit = jest.fn();

        require('./index.js');

        process.kill(process.pid, 'SIGTERM');

        jest.runAllTimers();

        expect(setTimeout.mock.calls.length).toBe(2);
    });
});

而测试失败了:

期望值(使用===):2接收:1,控制台日志输出为:

代码语言:javascript
代码运行次数:0
运行
复制
console.log tmp/index.js:10
    Timer 2 was run

  console.log tmp/index.js:2
    Got SIGTERM

如何让setTimeout在这里运行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-03 11:10:00

可以做的是模拟流程on方法,以确保在kill方法上调用处理程序。

确保调用处理程序的一种方法是模拟killon

代码语言:javascript
代码运行次数:0
运行
复制
describe('Test process SIGTERM handler', () => {
    test.only('runs timeout', () => {
        jest.useFakeTimers();

        processEvents = {};

        process.on = jest.fn((signal, cb) => {
          processEvents[signal] = cb;
        });

        process.kill = jest.fn((pid, signal) => {
            processEvents[signal]();
        });

        require('./index.js');

        process.kill(process.pid, 'SIGTERM');

        jest.runAllTimers();

        expect(setTimeout.mock.calls.length).toBe(2);
    });
});

另一种更通用的方法是在setTimeout中模拟处理程序并进行调用的测试,如下所示:

index.js

代码语言:javascript
代码运行次数:0
运行
复制
var handlers = require('./handlers');

process.on('SIGTERM', () => {
    console.log('Got SIGTERM');
    setTimeout(handlers.someFunction, 300);
});

handlers.js

代码语言:javascript
代码运行次数:0
运行
复制
module.exports = {
    someFunction: () => {}
};

index.spec.js

代码语言:javascript
代码运行次数:0
运行
复制
describe('Test process SIGTERM handler', () => {
    test.only('sets someFunction as a SIGTERM handler', () => {
        jest.useFakeTimers();

        process.on = jest.fn((signal, cb) => {
            if (signal === 'SIGTERM') {
                cb();
            }
        });

        var handlerMock = jest.fn();

        jest.setMock('./handlers', {
            someFunction: handlerMock
        });

        require('./index');

        jest.runAllTimers();

        expect(handlerMock).toHaveBeenCalledTimes(1);
    });
});
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46494297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档