如何在运行mocha测试后杀死nodemon进程?

时间:2015-09-28 12:43:49

标签: node.js gulp mocha nodemon

我需要一个gulp任务启动服务器,对它运行mocha测试并最终关闭它。我有以下代码:

var mocha = require('gulp-mocha');
var nodemon = require('nodemon');

gulp.task('my-integration-tests', function () {    
  return nodemon({ script: './server.js' })
    .on('start', function () {
      gulp.src(['./mySpecs.spec.js'])
        .pipe(mocha());            
  });    
});

服务器已成功启动并运行测试。但是在此之后,nodemon创建的进程仍然存在。有没有办法指示nodemon完成后关闭?在mocha测试的同一过程中打开和关闭应用程序也不是当前配置的选项。

更新:

除了ThomasBromans的回答,我想出了这个似乎适用于我的解决方案。每当gulp-mocha完成测试时,它就会发出“结束”事件。当发生这种情况时,我们只需要在子进程上发出'quit'然后终止主进程,如下所示:

gulp.task('my-integration-tests', function () {    
  var childProc = nodemon({ script: './server.js' });

  childProc.on('quit', function () {
    console.log('event emitted, child process is being killed');
  })

  childProc.on('start', function () {
      gulp.src(['./mySpecs.spec.js'])
        .pipe(mocha())
        .once('end', function () {
          console.log('mocha stuff ended. time to kill processes');
          childProc.emit('quit');
          setTimeout(function () {
            console.log('kill main process');
            process.exit();
          }, 1500);
        });            
  });    
});

不幸的是,我仍然需要在子进程被杀死和杀死主进程之间的超时,如果我删除超时,它会发生子进程仍然挂起。这个解决方案当然可以改进。

1 个答案:

答案 0 :(得分:1)

您可以使用process.exit()退出流程。只需添加另一个 .pipe 即可。您的任务将如下所示:

gulp.task('my-integration-tests', function () {    
  return nodemon({ script: './server.js' })
    .on('start', function () {
      gulp.src(['./mySpecs.spec.js'])
        .pipe(mocha())
        .pipe(process.exit());
  });
});

编辑按顺序运行任务(我不确定这是否可以正常运行):

var gulp = require('gulp'),
    mocha = require('gulp-mocha'),
    nodemon = require('nodemon'),
    runSequence = require('run-sequence');

gulp.task('nodemon', function() {
    return nodemon({script: './server.js'});
});

gulp.task('mocha', function() {
    return mocha();
});

gulp.task('stop', function() {
    process.exit();
});

gulp.task('my-integration-tests', function () {    
    runSequence('nodemon',
                'mocha',
                'stop');
});