如何在运行mocha测试后终止nodemon进程?

3
我需要一个 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完成测试时,它会发出一种“end”事件。当发生这种情况时,我们只需要在子进程上发出“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个回答

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');
});

感谢您的回答。这直接杀死了我的进程。似乎mocha甚至没有时间正常启动,就已经到达了process.exit()命令。它还会杀死gulp任务进程,但是由nodemon创建的进程在任务管理器中看起来很健康。我目前正在查看“nodemon.emit('quit');”类型的命令,这些命令取自它们的官方API,将看看是否可以在mocha运行结束时发出它。 - Vee6
@Vee6 嗯,奇怪。我没有用Mocha试过,但它在其他一些gulp任务中无缝运行。你可以尝试运行一个序列。如果你想的话,我可以更新我的答案。 - Thomas Bormans
你所说的“sequence”是指类似于async.series或类似的东西吗?如果您能为此更新,我将不胜感激。 - Vee6
@Vee6,我已经更新了我的回答。不过语法方面还有些不确定的地方,你可能需要更新一些小细节。 - Thomas Bormans
1
谢谢。runSequence解决方案看起来非常优雅。与此同时,我也想出了自己的解决方案,我会在帖子中分享。 - Vee6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接