Node.js Postgres和NodeJ的测试夹具
我正在尝试在React应用程序中为Postgres编写一些基本的测试夹具 我有一些安装和拆卸SQL文件:Node.js Postgres和NodeJ的测试夹具,node.js,postgresql,testing,jestjs,Node.js,Postgresql,Testing,Jestjs,我正在尝试在React应用程序中为Postgres编写一些基本的测试夹具 我有一些安装和拆卸SQL文件: ——###安装文件### 如果存在“请求”,则删除表; --此脚本仅包含表创建语句,并不完全表示数据库中的表。它仍然缺失:索引、触发器。不要将其用作备份。 --序列和定义类型 如果不存在请求,则创建序列\u id\u seq; --表定义 创建表“请求”( “id”int4非空默认nextval('requests_id_seq'::regclass), “状态”varchar(10), “
——###安装文件###
如果存在“请求”,则删除表;
--此脚本仅包含表创建语句,并不完全表示数据库中的表。它仍然缺失:索引、触发器。不要将其用作备份。
--序列和定义类型
如果不存在请求,则创建序列\u id\u seq;
--表定义
创建表“请求”(
“id”int4非空默认nextval('requests_id_seq'::regclass),
“状态”varchar(10),
“请求者”varchar(255),
“模板id”varchar(255),
“版本”varchar(10),
“细节”文本,
主键(“id”)
);
——###拆卸文件###
如果存在“请求”级联,则删除表;
如果存在“请求id顺序”级联,则丢弃顺序;
使用dbtools.js
helper文件从测试中调用:
/*eslint no-console: ["error", { allow: ["warn", "error"] }]*/
const Pool = require('../../db');
require('dotenv').config(); // Load .env file
//eslint-disable-next-line no-undef
const {PGUSER, PGPASSWORD, PGDATABASE, PGHOST, PGPORT} = process.env;
const util = require('util');
const exec = util.promisify(require('child_process').exec);
const create_sql = 'bin/sql/tables_setup.sql';
const droptables_sql = 'bin/sql/tables_down.sql';
function execute_sql_file(fileName){ //eslint-disable-line no-unused-vars
exec(
`PGPASSWORD="${PGPASSWORD}" psql -U ${PGUSER} -h ${PGHOST} -p ${PGPORT} -d ${PGDATABASE} -f ${fileName}; exit 0`,
function(err){
if (err !== null) {
console.error('Error populating db: ' + err);
}
}
);
}
function prepare_db(){
execute_sql_file(create_sql);
}
function clean_db(){
execute_sql_file(droptables_sql);
}
module.exports = { prepare_db, clean_db };
在app.test.js
文件中使用的:
...
beforeEach(async () => {
await prepare_db();
});
afterEach(async () => {
await clean_db();
});
...
当执行时,路线被邮递员击中,第一次一切正常,第二次失败
它似乎正在放下桌子,没问题,但没有重新设置它。当我手动运行安装文件时(psqlwebui-uppostgres
),它工作正常。有没有什么明显的事情是我做错了
(另外-这次请不要使用双关语,我不想使用模拟语)编辑
在重新阅读您的问题后,我意识到我下面的观察可能不是您真正想要的,因为您可能希望在实际的beforeach()
/afterEach()
中运行DB的设置/拆除
我注意到,您的exec()
函数启动了一个承诺,但实际上它并没有等待它,所以请尝试:
async function execute_sql_file(fileName){ //eslint-disable-line no-unused-vars
await exec(
`PGPASSWORD="${PGPASSWORD}" psql -U ${PGUSER} -h ${PGHOST} -p ${PGPORT} -d ${PGDATABASE} -f ${fileName}; exit 0`,
function(err){
if (err !== null) {
console.error('Error populating db: ' + err);
}
}
);
}
忽略下面的观察
尝试在beforeach()
/after()
方法中设置/拆除数据库,而不是在beforeach()
/afterEach()中设置/拆除数据库:
之前
和之后
似乎没有可用的函数;-)这当然解决了眼前的问题!谢谢当然,它提出了另一个-;-)我怀疑池没有被取消分配,并且我的连接正在耗尽…:-(
...
before(async () => {
await prepare_db();
});
after(async () => {
await clean_db();
});
...