运行 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:找不到命令”
如何运行用 TypeScript 编写的 Mocha 测试?
如何使用 supertest 和 agent 在 mocha 测试中发出经过身份验证的请求?
在我的 node.js 应用程序中使用 mongodb 和 mongoose 在 Mocha 和 Chai 上运行测试后无法清除数据库