【问题标题】:Ensure express app is running before starting mocha tests在开始 mocha 测试之前确保 express 应用程序正在运行
【发布时间】:2020-09-10 04:04:28
【问题描述】:

我使用 express 和 node.js 为 couchbase 数据库构建了一个 API。我的问题是,当我运行我的测试时,其中一些失败了,因为服务器没有完全运行。我在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 年的,所以我想也许语法已被弃用。我想知道是否有人可以帮我指出正确的方向?

【问题讨论】:

    标签: node.js express mocha.js couchbase supertest


    【解决方案1】:

    您可以添加以下条件,更多信息请参阅"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)
    

    【讨论】:

      猜你喜欢
      • 2013-09-27
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 2020-01-02
      • 2013-01-23
      相关资源
      最近更新 更多