首页 > 解决方案 > 使用 Jest 时 Knex 离开开放服务器(推荐)

问题描述

我正在尝试用我的以下堆栈做一些 TDD

我的问题从 koa 服务器的打开处理程序开始,我可以用服务器实例解决这个问题,然后用server.close()

但是,我有同样的问题knex;它使服务器保持打开状态,我必须运行它knex.close才能停止它。这样我就可以避免以下错误消息

测试运行完成后一秒钟,Jest 没有退出。

这通常意味着在您的测试中存在未停止的异步操作。考虑使用 --detectOpenHandles 运行 Jest 来解决此问题。

knex.config

const config = {
  development: {
    client: 'pg',
    connection: process.env.DATABASE_URL,
    migrations:{
      directory:"./migrations/"
    },
    pool: { min: 0, max: 7 }
  },
  test: {
    client: 'pg',
    connection: process.env.DATABASE_URL,
    migrations:{
      directory:"./migrations/"
    },
    pool: { min: 0, max: 7 }
  },
//TBD
  staging: {
    client: 'postgresql',
    connection: {
      database: 'my_db',
      user:     'username',
      password: 'password'
    },
    pool: {
      min: 2,
      max: 10
    },
    migrations: {
      tableName: 'knex_migrations'
    }
  },
  //TBD
  production: {
    client: 'postgresql',
    connection: {
      database: 'my_db',
      user:     'username',
      password: 'password'
    },
    pool: {
      min: 2,
      max: 10
    },
    migrations: {
      tableName: 'knex_migrations'
    }
  }

}


module.exports = config;

用户模型.js

'use strict';

const knex = require('../config/db/knex');
const { Model } = require('objection');
Model.knex(knex);

class User extends Model {

  // Table name is the only required property.
  static get tableName() {
    return 'user';
  }

  // Custom function to close knex
  static close() {
    knex.destroy();
  }
}

module.exports = User;

user.test.js

const supertest = require('supertest');
const server = require('../../server');
var request = require("supertest").agent(server);


describe("Test users routes", () => {
  let Model;
  beforeAll(async () => {
    // do something before anything else runs
    console.log('Jest starting!');
    Model = require('../../models/user.model')
  });
// close the server after each test
afterAll(() => {
  server.close();
  Model.close();
  console.log('server closed!');
});


  test("Get /",async () => {
       let res = await request.get('/users/');

       expect(res.status).toBe(200);

  });
});

我很确定这可能是我所做的更好的方法解决方案,可能与池相关或 knex.cofing 上的一些回调,但我不确定。

谢谢

标签: javascriptnode.jsjestjsknex.jskoa2

解决方案


推荐阅读