Mocha/ Supertest测试完成后未退出

3
我正在使用mocha测试框架,在运行以下测试后它并没有退出。我尝试了Promise和async await,但都没有成功。在mocha命令的结尾加上--exit可以解决问题,但我想找到问题的根源。
我想知道是否是在运行beforeEach和afterEach函数时knex数据库连接的问题。然而,除了destroy()之外,我不知道如何断开db连接,如果使用此方法,则以下测试将无法运行。
有人能在代码中发现可能导致此问题的内容吗?或者推荐其他解决方法吗?
const app = require('../../app');
const request = require('supertest');


describe('Route: /' + route, () => {
    let token = '';
    let route = 'user';

    before(function (done) {
        const user = {email: 'admin@email.com', password: 'password'};
        request(app)
            .post('/login')
            .send(user)
            .end((err, res) => {
                token = res.body.token;
                done();
            });
    });

    beforeEach(async () => {
        await knex.migrate.rollback();
        await knex.migrate.latest();
        await knex.seed.run();
    });
    afterEach(() => knex.migrate.rollback());

    it(`should not be able to consume /${route} since no token was sent`, (done) => {
        request(app)
            .get(`/${route}`)
            .expect(401, done)
    });

    it(`should be able to consume /${route} since a valid token was sent`, (done) => {
        request(app)
            .get(`/${route}`)
            .set('Authorization', 'Bearer ' + token)
            .expect(200, done);
    });
});
1个回答

3
对于任何遇到类似问题的人。
使用以下链接:
- GitHub mocha debug example
- Mocha docs -exit
- wtfnode 我能够调试出问题。
在我的测试中使用wtfnode向我展示了我的数据库仍然与控制台读取连接。
const wtf = require('wtfnode');

after(wtf.dump());  // place within test describe body

Returned;

- Sockets:
  - 127.0.0.1:58898 -> 127.0.0.1:5432
    - Listeners:
      - connect: Connection.connect @ <user_path>/node_modules/pg/lib/connection.js:59


我正在使用knex连接数据库,所以我已经在我的测试目录下的helper.js文件中添加了以下代码。

/test/helper.js

const knex = require('../database/db');


before(function () {
    if (!knex.client.pool) return knex.initialize();
});

beforeEach(async function () {
    await knex.migrate.rollback();
    await knex.migrate.latest();
    await knex.seed.run();
});

afterEach(function () {
    return knex.migrate.rollback()
});

after(function () {
    return knex.destroy();
});


看起来有点浪费,为什么不在“before”中创建一个连接池,然后在“after”中关闭呢?这正是使用连接池的主要目的... - James
@James - 谢谢。我已经更新了我的代码和评论。 - Matthew
给未来的读者留个便签:这并不仅限于Mocha。我正在使用内置的Node测试运行器(node:test),而这个解决方案同样修复了我的问题(感谢@Matthew)。 - machineghost
给未来的读者留个便签:这并不仅限于Mocha。我正在使用内置的Node测试运行器(node:test),这个解决方案同样解决了我的问题(感谢@Matthew)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接