我的用例非常简单:
首先,我想运行node server.js
(启动我的Node.js应用) - 并在Node启动后 - 我想运行mocha test
(运行一些测试由server.js
执行的npm run test
提供的API。
脚本:"test": "NODE_ENV=development node server.js && mocha test"
节点启动,但不幸的是mocha test
似乎没有执行:
那么如何在mocha test
之后执行node server.js
?
答案 0 :(得分:3)
你遇到这种情况的原因是node server.js
持续运行直到被杀(Ctrl + C)或发生致命的未处理异常。由于node
进程一直在运行mocha test
,因此永远不会执行。
一种方法是使用gulp
作为任务运行员,并利用实施gulp-nodemon
和gulp-mocha
的任务。如果您之前从未使用过Gulp或者对任务运行者不熟悉,我建议您事先阅读文档,以了解它是如何工作的。
将以下gulpfile.js
添加到您的应用中(根据需要调整一些设置)并使用下面的package.json
脚本修改您的test
脚本,这可以解决您的问题。
var gulp = require('gulp');
var mocha = require('gulp-mocha');
var nodemon = require('gulp-nodemon');
gulp.task('nodemon', (cb) => {
let started = false;
return nodemon({
script: 'server.js'
})
.on('start', () => {
if (!started) {
started = true;
return cb();
}
})
.on('restart', () => {
console.log('restarting');
});
});
gulp.task('test', ['nodemon'], function() {
return gulp.src('./test/*.js')
.pipe(mocha({reporter: 'spec' }))
once('error', function() {
process.exit(1);
})
.once('end', function() {
process.exit();
});
});
scripts
{
"scripts": {
"test": "NODE_ENV=development gulp test"
}
}
更优雅的解决方案,在我看来更好的选择是重写您的测试以使用supertest
。基本上你对supertest
所做的就是将你的Express实例传递给它,并使用supertest
包对它进行断言测试。
var mocha = require('mocha');
var request = require('supertest');
var server = require('server');
describe('test server.js', function() {
it('test GET /', function(done) {
request(server)
.get('/')
.expect(200, done);
});
});
答案 1 :(得分:1)
将此代码添加到您的测试用例
after(function (done) {
done();
process.exit(1);
})