【问题标题】:Testing child process.send with Jasmine in Node.js在 Node.js 中使用 Jasmine 测试子 process.send
【发布时间】: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-nodechild-process.js 进行单元测试,但是当我从规范中调用init() 方法时,jasmine-node 会抛出错误:

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

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

【问题讨论】:

    标签: javascript node.js unit-testing testing jasmine-node


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 2019-07-12
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      相关资源
      最近更新 更多