在 Node.js 中使用 Jasmine 测试子 process.send

Posted

技术标签:

【中文标题】在 Node.js 中使用 Jasmine 测试子 process.send【英文标题】:Testing child process.send with Jasmine in Node.js 【发布时间】:2015-03-22 12:17:17 【问题描述】:

我有一个 Node.js 应用程序,它有一个 main-process.js 和一个 child-process.js

main-process.js 看起来像这样:

var childProcess = require('child_process');
var job = childProcess.spawn('node', ["child-process.js"], 
  detached = true,
  stdio: ['ipc']
);

我的child-process.js 执行一些任务并通知父进程其状态,它使用:

exports.init = function() 
   //some processing here
   process.send(status: 'success or pending');

现在我想使用jasmine-node 对child-process.js 进行单元测试,但是当我从规范中调用init() 方法时,jasmine-node 会抛出错误:

TypeError: Object #<process> has no method 'send'

有没有办法模拟process 变量?换句话说,我如何对这个场景进行单元测试?

【问题讨论】:

【参考方案1】:

有没有办法模拟流程变量?换句话说,我如何对这个场景进行单元测试?

没有必要在child-process.js 中导出process.send() 功能。 您可以将process.send() 放在身体的任何位置,以便与main-process.js 回通信

我已经使用 Jasmine 成功运行了以下代码:

ma​​in-process.js

var childProcess = require('child_process');

// set an infinite loop that keeps main-process running endlessly
setInterval(() => null, 5000)

// spawn child process
var job = childProcess.spawn('node', ["child-process.js"], 
  detached: true,
  stdio: ['ipc']
);

// listen to the events returned by child process
job.on('message', (code, signal) =>
  console.log('[MAIN] received the ff from child process:', code, signal, 'at', new Date())
)

// export the job object, which is an event emitter that can be tested by Jasmine pkg
module.exports = job

child-process.js

const message = 
    message: `I'm working on it...`,
    status: 'success or pending'


// send a message to the parent every half second
setInterval(() => process.send(message), 500)

spec.js

const main = require('../main-process')

describe('main process', () =>
    it('should receive messages from spawned child process', (done) => 
        let eventCount = 0
        main.on('message', (code, signal) => 
            console.log('[JASMINE] received the event')
            eventCount++
            if (eventCount >= 5) 
                done()
            
        )
    )
)

输出

$ npm test

> so-jasmine-test@1.0.0 test C:\Users\jonathanlopez\nodejs\so-jasmine-test
> jasmine

Randomized with seed 29172
Started
[MAIN] received the ff from child process:  code:
    message: 'I\'m working on it...',
     status: 'success or pending' ,
  signal: undefined  at 2018-10-17T08:50:51.559Z
[JASMINE] received the event
[MAIN] received the ff from child process:  code:
    message: 'I\'m working on it...',
     status: 'success or pending' ,
  signal: undefined  at 2018-10-17T08:50:52.060Z
[JASMINE] received the event
[MAIN] received the ff from child process:  code:
    message: 'I\'m working on it...',
     status: 'success or pending' ,
  signal: undefined  at 2018-10-17T08:50:52.562Z
[JASMINE] received the event
[MAIN] received the ff from child process:  code:
    message: 'I\'m working on it...',
     status: 'success or pending' ,
  signal: undefined  at 2018-10-17T08:50:53.064Z
[JASMINE] received the event
[MAIN] received the ff from child process:  code:
    message: 'I\'m working on it...',
     status: 'success or pending' ,
  signal: undefined  at 2018-10-17T08:50:53.565Z
[JASMINE] received the event
.


1 spec, 0 failures
Finished in 2.736 seconds
Randomized with seed 29172 (jasmine --random=true --seed=29172)

【讨论】:

以上是关于在 Node.js 中使用 Jasmine 测试子 process.send的主要内容,如果未能解决你的问题,请参考以下文章

如何使用node.js jasmine设置断点?

在VSCode中为node.js应用程序调试vanilla jasmine

安装和使用Karma-Jasmine进行自动化测试

如何编写一个期望在 Jasmine 中抛出“错误”的测试?

node.js + coffeescript + jasmine 的好 IDE [关闭]

如何安装和使用Karma-Jasmine