Node.js 如何在单个npm测试命令中运行mocha测试和节点?(CI)

Node.js 如何在单个npm测试命令中运行mocha测试和节点?(CI),node.js,express,mocha.js,circleci,Node.js,Express,Mocha.js,Circleci,我想用它来集成git项目 我正在用摩卡咖啡进行测试 我想做什么? 运行npm测试时我想要: 我的节点服务器将启动 我要运行的测试文件 如何运行一个npm测试命令来运行node和mocha测试,这两个测试都已打包在一个index.js文件中 我在我的包.json中尝试过这一点: "scripts": { "test": "node server/app.js & mocha server/tests/index.js", "start": "node server/

我想用它来集成git项目

我正在用摩卡咖啡进行测试

我想做什么? 运行
npm测试时
我想要:

  • 我的节点服务器将启动
  • 我要运行的测试文件
如何运行一个
npm测试
命令来运行node和mocha测试,这两个测试都已打包在一个
index.js
文件中

我在我的
包.json中尝试过这一点:

  "scripts": {
    "test": "node server/app.js & mocha server/tests/index.js",
    "start": "node server/app.js",
    "postinstall": "bower install"
   }
上述问题
  • 我的服务器启动需要一些时间,测试失败,因为它们在服务器启动之前运行

是否有一种标准的方法可以用一个命令运行服务器和测试,但我缺少了一些东西?

当运行需要某些先决条件的测试时,我要做的是使用mochas beforeach()功能

从文件中

您还可以选择任何文件并添加“根”级挂钩。例如,将beforeach()添加到所有descripe()块之外。这将导致回调beforeach()在任何测试用例之前运行,而不管它所在的文件是什么(这是因为Mocha有一个隐含的descripe()块,称为“根套件”)

在每个代码块之前,可以运行命令启动服务器 例如,使用npm中的exec库


这将确保您的服务器在测试运行之前运行,从而允许您简单地运行npm测试。

如果您的情况可能的话,我建议使用类似的方法进行测试。通过这种方式,您可以避免在启动测试之前必须启动服务器

我知道在某些情况下,无法使用
supertest
。在这种情况下,您可以在所有测试之前在
before
hook中轮询服务器,以等待它准备就绪:

before(function (done) {
  // Set a reasonable timeout for this hook.
  this.timeout(5000);

  function check() {
    if (serverIsReady()) {
      done();
      return; 
    }

    // The server is no ready, check again in 1/10th of a second.
    setTimeout(check, 100);
  }

  check(); // Start checking.
});

我不确定在您的情况下,
serverIsReady
应该是什么。它可能是试图从服务器获取一个简单的路径,比如在路径
/
上发出
GET
,我认为关键是在测试中运行节点服务器,而不是在另一个进程中尝试初始化它

你的摩卡测试应该从对你的应用程序的一个要求开始,然后每个 您的所有测试都可以与之交互

例如:

var http = require('http');

var server = http.createServer(function(req, res){
  res.end('Hello World\n');
})

server.listen(8888);

describe('http', function(){
  it('should provide an example', function(done){
    http.get({ path: '/', port: 8888 }, function(res){
      expect(res).to.have.property('statusCode', 200);
      done();
    })
  })
})
var http = require('http');

var server = http.createServer(function(req, res){
  res.end('Hello World\n');
})

server.listen(8888);

describe('http', function(){
  it('should provide an example', function(done){
    http.get({ path: '/', port: 8888 }, function(res){
      expect(res).to.have.property('statusCode', 200);
      done();
    })
  })
})