#node.js #postgresql #pg-promise
#node.js #postgresql #pg-обещание
Вопрос:
В моем файле модульного теста Jest, который использует библиотеку pgPromise, я получаю эту ошибку:
Jest не вышел через секунду после завершения тестового запуска.
Я думаю, это должно быть из-за приведенного ниже кода, который у меня есть в моем app.ts
import {db} from './shared/db';
...
let sco: any;
db.connect().then(function (obj: any) {
sco = obj;
obj.client.query('LISTEN "table_update"');
obj.client.on('notification', function (data: any) {
var result = JSON.parse(data.payload);
log.info(result);
globalEmitter.emit(
eventTypes.Entity_Data_Changed,
result
}
catch(error) {
log.error({ error }, 'Error happened');
})
.finally(() => {
// release the connection, if it was successful:
if (sco) {
sco.done();
}
});;
Я использую тот же импорт в своем файле модульного теста.
БД поступает из
const db = pgp(options);
В моем файле модульного теста у меня есть этот код в конце
afterAll(async done => {
setImmediate(done); // jest address open handle with --detectOpenHandles
db.$pool.end();
pgp.end();});
Я попробовал pgp.end(), чтобы уничтожить все соединения, поскольку я подозреваю, что выражение db в файле app.ts не принадлежит пулу соединений, поскольку я где-то читал об этом раньше. Но все равно не повезло. здесь будет оценена любая помощь.
Комментарии:
1. Когда вы используете ручное подключение , вам нужно позвонить
done
в конце. Вы этого не показываете. Кроме того, нет смысла вызывать.$pool.end()
, если вы вызываетеpgp.end()
сразу после, что завершает все пулы в процессе.2. вы тестируете саму базу данных? если нет, рассмотрите возможность издевательства над базой данных.
3. @DanielA. Белый, да, на самом деле это итерационный тест
4.
Not sure how I can use done in that situation
— здесь нет ничего особенного. Когда ваш тест завершится, вызовитеdone
выделенное соединение. Если не вызывать его, соединение зависает за пределами пула, потому что вы используетеconnect
.5. Спасибо @vitaly-t, поэтому я обновил свой код, как указано выше, и он сработал. Я думаю, это то, что вы имели в виду. пожалуйста, сообщите, если иначе. спасибо за ваше драгоценное время.