[英]Open handles while testing Koa.js with Jest
Here's a trivial trivial koa
server implementation:这是一个简单的
koa
服务器实现:
const Koa = require('koa')
const api = require('./resources')
const createServer = () => {
const app = new Koa()
app.use(api.routes())
app.use(api.allowedMethods())
return app
}
module.exports = createServer
And a simple test:和一个简单的测试:
const request = require('supertest')
const createServer = require('../src/server')
const { knex } = require('../src/config/db')
let server
beforeAll(() => {
server = createServer().listen(8081)
return server
})
beforeEach(() => {
return () => {
knex.migrate.latest()
knex.seed.run()
}
})
afterEach(() => {
return () => {
knex.migrate.rollback()
}
})
afterAll(() => {
server.close()
})
describe('routes: /api/users', () => {
describe('GET /users', () => {
test('should return json', async () => {
const response = await request(server).get('/api/users')
expect(response.status).toEqual(200)
expect(response.type).toEqual('application/json')
expect(response.body).toHaveLength(3)
})
})
})
I will skip the example route for brevity sake as the test passes successfully.当测试成功通过时,为了简洁起见,我将跳过示例路线。 But then it hangs, and running
jest --detectOpenHandles
produces:但随后它挂起,运行
jest --detectOpenHandles
会产生:
Jest has detected the following 1 open handle potentially keeping Jest from exiting:
● TCPSERVERWRAP
6 |
7 | beforeAll(() => {
> 8 | server = createServer().listen(8081)
| ^
9 | return server
10 | })
11 |
at Application.listen (node_modules/koa/lib/application.js:82:19)
at Object.<anonymous> (__tests__/routes.test.js:8:27)
Why does this occur and how can I fix it?为什么会发生这种情况,我该如何解决?
There are several problems.有几个问题。
return server
doesn't affect anything, it can be removed. return server
不影响任何东西,它可以被删除。 But beforeAll
doesn't wait for the server to start, it should be:但是
beforeAll
不等待服务器启动,它应该是:
beforeAll(done => {
server = createServer().listen(8081, done)
})
beforeEach
and afterEach
return functions that are not executed, promises from Knex aren't chained, it should be: beforeEach
和afterEach
返回未执行的函数,来自 Knex 的承诺没有链接,它应该是:
beforeEach(async () => {
await knex.migrate.latest()
await knex.seed.run()
})
afterEach(async () => {
await knex.migrate.rollback()
})
afterAll
doesn't wait for server connection to be closed, which is likely the cause for this error, it should be: afterAll
不会等待服务器连接关闭,这可能是导致此错误的原因,它应该是:
afterAll(done => {
server.close(done)
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.