Jest 检测到以下 1 个可能阻止 Jest 退出的打开句柄:TCPSERVERWRAP

问题描述

在这里一个基本的端到端测试,目前它失败了,但首先我无法摆脱打开的句柄。

Ran all test suites.

Jest has detected the following 1 open handle potentially keeping Jest from exiting:

  ●  TcpsERVERWRAP

      40 |     }
      41 |     return request(app.getHttpServer())
    > 42 |       .post('/graphql')
         |        ^
      43 |       .send(mutation)
      44 |       .expect(HttpStatus.OK)
      45 |       .expect((response) => {

      at Test.Object.<anonymous>.Test.serverAddress (../node_modules/supertest/lib/test.js:61:33)
      at new Test (../node_modules/supertest/lib/test.js:38:12)
      at Object.obj.<computed> [as post] (../node_modules/supertest/index.js:27:14)
      at Object.<anonymous> (app.e2e-spec.ts:42:8)
import { Test,TestingModule } from '@nestjs/testing'
import { HttpStatus,InestApplication } from "@nestjs/common";
import * as request from 'supertest'
import { AppModule } from '../src/app.module'

describe('AppController (e2e)',() => {
  let app: InestApplication

  beforeEach(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule],}).compile()

    app = moduleFixture.createnestApplication()
    await app.init()
  })

  afterall(async () => {
    await app.close()
  })

  it('/ (GET)',() => {
    return request(app.getHttpServer())
      .get('/')
      .expect(HttpStatus.OK)
      .expect('Hello World!')
  })

  it('mutation',async () => {
    const mutation = {
      query: `mutation Create($title: String!) {
        create(title: $title) {
          id,title
        }
      }`,variables: {
        title: 'Mon programme',},}
    return request(app.getHttpServer())
      .post('/graphql')
      .send(mutation)
      .expect(HttpStatus.OK)
      .expect( (response) => {
        expect(response.body).toBe({
          id: expect.any(String),title: 'Mon programme',})
      })
  })
})

知道是什么阻碍了测试运行程序吗?

请注意,由于我使用的是 nestJs,因此我不需要在测试结束时使用 .end(done) 方法

PS:显然我在这个问题上有很多代码,我需要添加更多细节,但不知道我还能说些什么。

解决方法

您正在重新创建整个应用程序 beforeEach,但仅在 afterAll 中将其拆除,这意味着您可能在此过程中泄漏了一些内存。您正在为 app 变量分配一个新实例,但很可能存在阻止垃圾收集器清除前一个实例的隐藏引用 - 就像 request 函数获得的引用一样。

beforeEach 更改为 beforeAll,您应该可以开始使用了。

,

我还没有找到完美的解决方案,但目前我选择了这个解决方法:

jest --config ./test/jest-e2e.json --forceExit

forceExit 选项以某种方式杀死 openHandles 并解锁所有内容。 然而,我仍在寻找处理该问题的“正确方法”。