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

Posted

技术标签:

【中文标题】运行 mocha 测试后如何杀死 nodemon 进程?【英文标题】:How can I kill nodemon process after running mocha tests? 【发布时间】:2015-12-25 17:09:20 【问题描述】:

我需要有一个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 完成测试时,它都会发出一个“结束”事件。发生这种情况时,我们只需要在子进程上发出“退出”,然后终止主进程,如下所示:

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】:

您可以使用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());
  );
);

EDIT按顺序运行任务(我不确定如果没有任何更改,这是否可行):

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

【讨论】:

感谢您的回答。这只会彻底杀死我的进程。当管道命令到达 process.exit() 时,似乎 mocha 甚至没有时间正确启动。它还杀死了 gulp 任务进程,但 nodemon 创建的进程是活动的,并且在任务管理器中可以看到。我目前正在查看“nodemon.emit('quit');”从他们的官方 api 中获取的命令类型将查看我是否可以让它在 mocha 运行结束时发出。 @Vee6 嗯。诡异的。我没有在 Mocha 上尝试过,但它可以与其他一些 gulp 任务无缝协作。您可以尝试运行序列。如果你愿意,我可以更新我的答案吗? 按顺序你的意思是像 async.series 或类似的东西?如果你能更新这个案例,我将不胜感激。 @Vee6 我已经更新了我的答案。虽然不是 100% 确定语法。您可能需要更新一些小事。 谢谢。 runSequence 解决方案看起来非常优雅。在此期间,我提出了自己的想法,我也会发布。

以上是关于运行 mocha 测试后如何杀死 nodemon 进程?的主要内容,如果未能解决你的问题,请参考以下文章

您如何安装和运行 Mocha,Node.js 测试模块?安装后获取“mocha:找不到命令”

如何杀死mac上的nodemon进程? [关闭]

如何使用 Mocha 运行单个测试?

如何运行用 TypeScript 编写的 Mocha 测试?

如何使用 supertest 和 agent 在 mocha 测试中发出经过身份验证的请求?

在我的 node.js 应用程序中使用 mongodb 和 mongoose 在 Mocha 和 Chai 上运行测试后无法清除数据库