代码之家  ›  专栏  ›  技术社区  ›  Christopher Francisco

即使在我的Express应用程序上运行server.close()之后,jest测试仍挂起

  •  4
  • Christopher Francisco  · 技术社区  · 6 年前

    我有一个快速应用程序,我需要从我的集成测试用例开始。

    Express应用程序在 app.js 文件 没有监听任何端口 . 所以,我的测试用例是这样的:

    const app = require('../src/app');
    
    describe('Pact Verification', () => {
      const port = 3002;
      let server;
    
      beforeAll(done => {
        const server = http.createServer(app);
        server.listen({ port }, done)
      });
    
      afterAll(done => {
        server.close(done);
      });
    
      it(....
    

    问题是,一旦使用 Jest 它悬挂着。我也必须 --forceExit ^C 退出。

    我甚至更新到jest 23使用 --detectOpenHandles 但我在终端上看不到任何输出,它一直挂着,所以这也没有帮助。

    自从出口 app 没有监听任何端口 它没有任何数据库连接之类的 问题不太可能在那里,可能在我的 beforeAll / afterAll 块。我错过了什么?

    更新1

    这是我的内容 App.JS

    var express = require('express');
    var path = require('path');
    var logger = require('morgan');
    
    var indexRouter = require('./routes/index');
    
    var app = express();
    
    if (process.env.NODE_ENV !== 'test') {
      app.use(logger('dev'));
    }
    app.use(express.json());
    
    app.use('/api/v1/', indexRouter); // <-- these endpoints just return faker data in JSON format (https://github.com/marak/Faker.js/)
    
    app.use((req, res, next) => {
      const err = Error('Not Found');
      err.status = 404;
      next(err);
    });
    
    app.use((err, req, res, next) => {
      const { status, message } = err;
    
      const stack = status !== 404 && err.stack || undefined;
    
      res.status(status || 500)
        .json({
          message,
          stack,
        });
    });
    
    module.exports = app;
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Estus Flask    6 年前

    问题是 server undefined 在里面 afterAll 因为它被分配到另一个作用域中 const server = http.createServer(app) . 相反,它应该是:

    server = http.createServer(app);
    

    应该有例外,所以 done 永远不会被召唤进来 毕竟 . 当前,Jest禁止错误来自 毕竟 有笑话 open issue 那个地址 毕竟 缺陷。