问题描述
我在这里做一个基本的端到端测试,目前它失败了,但首先我无法摆脱打开的句柄。
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 并解锁所有内容。 然而,我仍在寻找处理该问题的“正确方法”。