在开始 mocha 测试之前确保 express 应用程序是 运行

Ensure express app is running before starting mocha tests

我使用 express 和 node.js 为 couchbase 数据库构建了一个 API。我的问题是,当我 运行 我的一些测试失败时,因为服务器没有完全 运行ning。我在这里 https://mrvautin.com/ensure-express-app-started-before-tests 找到了关于如何解决这个问题的解决方案。文章指出,为了解决这个问题,您必须像这样在您的服务器文件中添加一个事件发射器

app.listen(app_port, app_host, function () {
    console.log('App has started');
    app.emit("appStarted");
});

然后在你的测试文件中添加这个

before(function (done) {
    app.on("appStarted", function(){
        done();
    });
});

我试过了,这是我的实现

服务器文件

app.listen(config['server']['port'], function(){
    app.emit("appStarted");
    logger.info("Listening")
})

测试文件

before(function(done){
    app.on("appStarted", function(){
        done();
    })
});

我不断收到以下错误

  1) "before all" hook in "{root}":
     Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
      at listOnTimeout (internal/timers.js:549:17)
      at processTimers (internal/timers.js:492:7)

这篇文章来自 2016 年,所以我在想可能语法已被弃用。我想知道是否有人可以帮我指明正确的方向?

您可以添加以下条件,更多信息见"Accessing the main module".

if (require.main === module) {
     // this module was run directly from the command line as in node xxx.js
} else {
     // this module was not run directly from the command line and probably loaded by something else
}

例如

index.ts:

import express from 'express';

const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.sendStatus(200);
});

if (require.main === module) {
  app.listen(port, () => {
    console.log('App has started');
  });
}

export { app, port };

index.test.ts:

import { app, port } from './';
import http from 'http';
import request from 'supertest';

describe('63822664', () => {
  let server: http.Server;
  before((done) => {
    server = app.listen(port, () => {
      console.log('App has started');
      done();
    });
  });
  after((done) => {
    server.close(done);
    console.log('App has closed');
  });
  it('should pass', () => {
    return request(server)
      .get('/')
      .expect(200);
  });
});

集成测试结果:

(node:22869) ExperimentalWarning: The fs.promises API is experimental
  63822664
App has started
    ✓ should pass
App has closed


  1 passing (26ms)