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

Chr*_*sco 5 node.js express jestjs

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

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(....
Run Code Online (Sandbox Code Playgroud)

问题是,一旦使用进行了测试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;
Run Code Online (Sandbox Code Playgroud)

Est*_*ask 5

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

server = http.createServer(app);
Run Code Online (Sandbox Code Playgroud)

应该有一个例外,所以done永远不会被调用afterAll。目前,Jest 抑制了来自 的错误afterAll,有一个解决 bug 的Jest开放问题afterAll