简体   繁体   English

使用 Jest 测试 Koa.js 时打开句柄

[英]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: beforeEachafterEach返回未执行的函数,来自 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM