npm run script:node server.js&&摩卡测试

时间:2016-05-23 21:58:36

标签: node.js npm mocha

我的用例非常简单:

首先,我想运行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似乎没有执行:

enter image description here

那么如何在mocha test之后执行node server.js

2 个答案:

答案 0 :(得分:3)

你遇到这种情况的原因是node server.js持续运行直到被杀(Ctrl + C)或发生致命的未处理异常。由于node进程一直在运行mocha test,因此永远不会执行。

一种方法是使用gulp作为任务运行员,并利用实施gulp-nodemongulp-mocha的任务。如果您之前从未使用过Gulp或者对任务运行者不熟悉,我建议您事先阅读文档,以了解它是如何工作的。

将以下gulpfile.js添加到您的应用中(根据需要调整一些设置)并使用下面的package.json脚本修改您的test脚本,这可以解决您的问题。

gulpfile.js

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

package.json scripts

{
  "scripts": {
    "test": "NODE_ENV=development gulp test"
  }
}

Supertest Alternative

更优雅的解决方案,在我看来更好的选择是重写您的测试以使用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);
 })