如何在 childporcess.on 退出事件中测试侦听器功能

古拉布·保罗

我无法增加退出时由子进程调用的测试覆盖率/测试函数。我想模拟 fork('src/services/ssync-process.js');

log.info('子进程sProcessJob执行完毕'); sProcess.kill();

永远不会被覆盖

测试.js

const sinon = require('sinon');
const rewire = require('rewire');
const { EventEmitter } = require('events');
const job = rewire('../../src/services/job');

it('test exit', () => {
    const mockChildProcess = new EventEmitter();

    mockChildProcess.emit('exit');
    mockChildProcess.kill = sinon.stub();
    mockChildProcess.killed = true;
    job.__set__({
      sProcess: mockChildProcess,
    });

    job.sSyncJob();
  });

作业.js

const { fork } = require('child_process');

let sProcess;

const sSyncJob = () => {
  if (!sProcess || sProcess.killed) {
    sProcess = fork('src/services/ssync-process.js');
    sProcess.send({ hello: 'world' });
    sProcess.on('message', (msg) => {
      log.info('Message from child', msg);
    });
    sProcess.on('exit', () => {
      log.info('Child process sProcessJob finished execution');
      sProcess.kill();
    });
  }
};
幻灯片p2

下面是一个使用单元测试溶液链接接缝proxyquire包和再布线包。

例如

job.js

let { fork } = require('child_process');

const log = {
  info: console.info,
};

let sProcess;

const sSyncJob = () => {
  if (!sProcess || sProcess.killed) {
    sProcess = fork('src/services/ssync-process.js');
    sProcess.send({ hello: 'world' });
    sProcess.on('message', (msg) => {
      log.info('Message from child', msg);
    });
    sProcess.on('exit', () => {
      log.info('Child process sProcessJob finished execution');
      sProcess.kill();
    });
  }
};

exports.sSyncJob = sSyncJob;

job.test.js

const sinon = require('sinon');
const proxyquire = require('proxyquire');
const rewire = require('rewire');

describe('61561718', () => {
  afterEach(() => {
    sinon.restore();
  });
  it('should receive message', () => {
    const logSpy = sinon.spy(console, 'info');
    const child_process_fork_stub = {
      send: sinon.stub().returnsThis(),
      on: sinon
        .stub()
        .returnsThis()
        .yields('fake message'),
      kill: sinon.stub(),
    };
    const child_process_stub = {
      fork: sinon.stub().returns(child_process_fork_stub),
    };
    const job = proxyquire('./job', {
      child_process: child_process_stub,
    });
    job.sSyncJob();
    sinon.assert.calledWithExactly(child_process_stub.fork, 'src/services/ssync-process.js');
    sinon.assert.calledWithExactly(child_process_fork_stub.send, { hello: 'world' });
    sinon.assert.calledWithExactly(child_process_fork_stub.on, 'message', sinon.match.func);
    sinon.assert.calledWithExactly(child_process_fork_stub.on, 'exit', sinon.match.func);
    sinon.assert.calledWithExactly(logSpy, 'Message from child', 'fake message');
    sinon.assert.calledWithExactly(logSpy, 'Child process sProcessJob finished execution');
    sinon.assert.calledOnce(child_process_fork_stub.kill);
  });

  it('should not fork child process if sProcess exists', () => {
    const job = rewire('./job');
    const child_process_stub = {
      fork: sinon.stub(),
    };
    job.__set__({
      sProcess: {},
      child_process: child_process_stub,
    });
    job.sSyncJob();
    sinon.assert.notCalled(child_process_stub.fork);
  });
});

第一个测试用例proxyquire用于测试,第二个测试用例rewire用于测试。

100% 覆盖率的单元测试结果:

  61561718
Message from child fake message
Child process sProcessJob finished execution
    ✓ should receive message
    ✓ should not fork child process if sProcess exists


  2 passing (52ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 job.js   |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在EaselJS对象中删除事件侦听器

如何在 JavaScript 中停用 beforeunload 事件侦听器

反应。如何在创建的侦听器中删除事件侦听器?

如何从具有匿名功能的div中删除事件侦听器

我如何实现对事件侦听器的功能

如何在输入字段上对事件侦听器进行单元测试?

如何在动态字符串的反应js中事件侦听器或单击侦听器?

如何在事件侦听器中覆盖事件阻止默认值?

如何在node.js事件侦听器中获取事件名称?

如何从reactjs中的文档中删除事件侦听器

如何在Firefox调试器中删除事件侦听器?

如何在会话和路由器侦听器之间注册事件侦听器?

如何在 Scala.js 中的单击事件侦听器中检索标签名称?

如何在<head>中的脚本标记中触发事件侦听器

如何在Polymer中的自定义元素属性中添加事件侦听器?

如何从类方法中删除事件侦听器

如何从正在卸载的背景中删除事件侦听器?

如何删除Aurelia中的事件侦听器?

如何正确删除 vue 3 中的事件侦听器

如何在Firebase值事件上设置侦听器?

如何在的IntelliJ插件添加事件侦听器?

如何在事件发生之前删除侦听器?

如何在div上使用“ keydown”事件侦听器?

如何在 ReactJS 中使用事件侦听器?

如何在事件侦听器中获取经过身份验证的用户-Laravel

如何在声明性组件中创建onChange事件侦听器?

如何在Angular 2中为呈现的元素绑定事件侦听器?

如何在Swing中临时禁用事件侦听器?

如何在Java或JavaScript中为事件侦听器提供对象池