Тестирование дочернего процесса.send с Жасмин в Node.js
У меня есть приложение 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'});
}
Теперь я хочу модульный тест child-process.js
используя жасмин-узел, но когда я вызываю метод init()
из спецификации, jasmine-node
выдает ошибку:
TypeError: Object #<process> has no method 'send'
Есть ли способ издеваться над process
переменная? Другими словами, как мне выполнить юнит-тестирование этого сценария?
1 ответ
Есть ли способ издеваться над переменной процесса? Другими словами, как мне выполнить юнит-тестирование этого сценария?
Нет необходимости экспортировать process.send()
функциональность в child-process.js
, Вы можете положить process.send()
в любом месте тела, чтобы общаться с main-process.js
Я успешно запустил приведенный ниже код, используя Jasmine:
Основные-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
дети-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)