Тест Мокко истощает пул соединений postgres

#node.js #postgresql #mocha.js

#node.js #postgresql #mocha.js

Вопрос:

Я пытаюсь запустить тесты Mocha, но всегда получаю сообщение об ошибке:

 Unhandled rejection Error: pool is draining and cannot accept work
at Pool.acquire (D:CodesNodeposgmvcnode_modulesgeneric-
poollibgeneric-pool.js:385:11)
at D:CodesNodeposgmvcnode_modulesknexlibclient.js:281:19
at Promise._execute     (D:CodesNodeposgmvcnode_modulesbluebirdjsreleasedebuggability.js:299:9)
at Promise._resolveFromExecutor         (D:CodesNodeposgmvcnode_modulesbluebirdjsreleasepromise.js:481:18)
at new Promise     (D:CodesNodeposgmvcnode_modulesbluebirdjsreleasepromise.js:77:14)
at Client_PG.acquireConnection     (D:CodesNodeposgmvcnode_modulesknexlibclient.js:272:12)
at D:CodesNodeposgmvcnode_modulesknexlibrunner.js:199:23
at Promise._execute     (D:CodesNodeposgmvcnode_modulesbluebirdjsreleasedebuggability.js:299:9)
at Promise._resolveFromExecutor     (D:CodesNodeposgmvcnode_modulesbluebirdjsreleasepromise.js:481:18)
at new Promise     (D:CodesNodeposgmvcnode_modulesbluebirdjsreleasepromise.js:77:14)
at D:CodesNodeposgmvcnode_modulesknexlibrunner.js:198:35
at tryCatcher     (D:CodesNodeposgmvcnode_modulesbluebirdjsreleaseutil.js:16:23)
at Function.Promise.attempt.Promise.try     (D:CodesNodeposgmvcnode_modulesbluebirdjsreleasemethod.js:39:29)
at Runner.ensureConnection     (D:CodesNodeposgmvcnode_modulesknexlibrunner.js:197:34)
at Runner.run (D:CodesNodeposgmvcnode_modulesknexlibrunner.js:47:42)
at Builder.Target.then     (D:CodesNodeposgmvcnode_modulesknexlibinterface.js:35:43)
at Context.<anonymous> (D:CodesNodeposgmvctestarticle.js:21:30)
at callFnAsync     (C:UsersAshutoshAppDataRoamingnpmnode_modulesmochalibrunnable.js:366:21)
at Hook.Runnable.run (C:UsersAshutoshAppDataRoamingnpmnode_modulesmochalibrunnable.js:316:7)
at next (C:UsersAshutoshAppDataRoamingnpmnode_modulesmochalibrunner.js:309:10)
at Immediate._onImmediate (C:UsersAshutoshAppDataRoamingnpmnode_modulesmochalibrunner.js:339:5)
at tryOnImmediate (timers.js:543:15)
at processImmediate [as _immediateCallback] (timers.js:523:5)
 

Вот мой тест:

 // During the test the env variable is set to test
process.env.NODE_ENV = 'test';

//Require the dev-dependencies
var chai = require('chai'),
chaiHttp = require('chai-http'),
server = require('../app'),
db = require('../app/db');

var should = chai.should();

chai.use(chaiHttp);

var id;

describe('Article URLs', function () {

//Before each test we empty the database
beforeEach(function (done) {

    db("articles").del().then(function (count) {
        console.log(count);
    }).finally(function () {
        db.destroy();
    });

    done();
});

describe('/POST article', function () {
    it('it should create new article', function (done) {

        chai.request(server)
            .post('/api/articles')
            .send({
                title: 'test title',
                url: 'some url',
                text: 'some text'
            })
            .end(function (err, res) {
                res.should.have.status(200);
                res.should.be.json;
                res.body.should.have.property('id');
                res.body.should.have.property('message');
                res.body.message.should.equals('done');

                id = res.id;

                done();
            });
    });
});

describe('/PUT article', function () {
    it('it should update article', function (done) {

        chai.request(server)
            .put('/api/articles/'   id)
            .send({
                title: 'new title',
                url: 'new url',
                text: 'new text'
            })
            .end(function (err, res) {
                res.should.have.status(200);
                res.should.be.json;
                res.body.should.have.property('id');
                res.body.should.have.property('message');
                res.body.message.should.equals('done');
                done();
            });
    });
});

describe('/GET articles', function () {
    it('it should return all articles', function (done) {
        chai.request(server)
            .get('/api/articles')
            .end(function (err, res) {
                res.should.have.status(200);
                res.should.be.json;
                res.body.should.be.a('array');
                res.body.length.should.be.greaterThan(0);
                res.body.should.have.property('articles');
                res.body.should.have.property('message');
                res.body[0].should.have.property('id');
                res.body[0].should.have.property('title');
                res.body[0].should.have.property('text');
                done();
            });
    });
});

describe('/GET article', function () {
    it('it should return single article', function (done) {
        chai.request(server)
            .get('/api/articles/'   id)
            .end(function (err, res) {
                res.should.have.status(200);
                res.should.be.json;
                res.body.should.have.property('article');
                res.body.should.have.property('message');
                res.body.should.have.property('id');
                res.body.should.have.property('title');
                res.body.should.have.property('text');
                done();
            });
    });
});

describe('/DELETE article', function () {
    it('it should delete single article', function (done) {
        chai.request(server)
            .delete('/api/articles/'   id)
            .end(function (err, res) {
                res.should.have.status(200);
                res.should.be.json;
                res.body.should.have.property('count');
                res.body.should.have.property('message');
                res.body.count.should.be.greaterThan(0);
                res.body.message.should.be.equals('found');
                done();
            });
    });
});

});
 

Вот мой knexfile.js:

 module.exports = {

development: {
    client: 'postgresql',
    connection: {
        database: 'posgmvc-development',
        user:     'postgres',
        password: 'pa$w0rd'
    },
    pool: {
        min: 2,
        max: 10
    }
},

test: {
    client: 'postgresql',
    connection: {
        database: 'posgmvc-test',
        user:     'postgres',
        password: 'pa$w0rd'
    },
    pool: {
        min: 2,
        max: 10
    }
}
};
 

Ответ №1:

У меня нет никакого опыта работы с Knex, но это выглядит неправильно:

 beforeEach(function (done) {

    db("articles").del().then(function (count) {
        console.log(count);
    }).finally(function () {
        db.destroy();
    });

    done();
});
 

Вы уничтожаете базу данных после удаления всех статей, и этот код выполняется перед каждым тестом. Итак, для второго теста, когда выполняется этот код, db он уже уничтожен / признан недействительным.

Попробуйте это (также, вместо использования done , он использует встроенную поддержку обещаний Mocha):

 beforeEach(function() {
  return db("articles").del().then(function (count) {
    console.log(count);
  });
});