Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Postgres和NodeJ的测试夹具_Node.js_Postgresql_Testing_Jestjs - Fatal编程技术网

Node.js Postgres和NodeJ的测试夹具

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), “

我正在尝试在React应用程序中为Postgres编写一些基本的测试夹具

我有一些安装和拆卸SQL文件:

——###安装文件###
如果存在“请求”,则删除表;
--此脚本仅包含表创建语句,并不完全表示数据库中的表。它仍然缺失:索引、触发器。不要将其用作备份。
--序列和定义类型
如果不存在请求,则创建序列\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();
  });

  ...