#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);
});
});