gpt4 book ai didi

javascript - 如何使用 Jest/Supertest/Knex/Postgres 处理外键约束

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:24 25 4
gpt4 key购买 nike

我正在尝试开始为我的应用程序编写测试。我正在使用 Jest & Supertest 来运行我的所有测试。当我尝试运行测试套件时,收到有关外键约束的错误。

错误:

error: truncate "users" restart identity - cannot truncate a table referenced in a foreign key constrainterror: cannot truncate a table referenced in a foreign key constraint

这是我的 server.spec.js 文件:

const request = require('supertest');
const server = require('./server.js');
const db = require('../data/db-config.js');

describe('server.js', () => {
describe('POST /register', () => {
it('should return 201 created', async () => {
const user =
{
name: "test",
username: "test",
email: "test77@test.com",
password: "password"
}
const res = await request(server).post('/api/auth/register').send(user);
expect(res.status).toBe(201);
})

beforeEach(async () => {
await db("graphs").truncate();
await db("users").truncate();
});
})
})

这是我的 knex 迁移文件:

exports.up = function(knex) {
return (
knex.schema
.createTable('users', tbl => {
tbl.increments();
tbl.string('username', 255).notNullable();
tbl.string('password', 255).notNullable();
tbl.string('name', 255).notNullable();
tbl.string('email', 255).unique().notNullable();
})
.createTable('graphs', tbl => {
tbl.increments();
tbl.string('graph_name', 255).notNullable();
tbl.specificType('dataset', 'integer[]').notNullable();
tbl
.integer('user_id')
.unsigned()
.notNullable()
.references('id')
.inTable('users')
.onDelete('CASCADE')
.onUpdate('CASCADE');
})
)
};

exports.down = function(knex) {
return (
knex.schema
.dropTableIfExists('graphs')
.dropTableIfExists('users')
)
};

我在研究中发现了这个答案:How to test tables linked with foreign keys?

我对 Postgres 和测试都很陌生。这是有道理的,我需要像迁移中那样以相反的顺序删除表。但是,当我尝试在测试的 beforeEach 部分中 chop 它们时,表的列出顺序似乎并不重要。

我不知道从这里到底该去哪里。任何帮助将不胜感激。

最佳答案

我认为这里的技巧是求助于一些knex.raw:

await db.raw('TRUNCATE graphs, users RESTART IDENTITY CASCADE');

CASCADE 因为您不希望外键约束妨碍,RESTART IDENTITY 因为默认的 Postgres 行为不是重置序列。请参阅TRUNCATE .

当我们讨论相关主题时,请允许我介绍一些可能会让您的生活变得更轻松的东西:模板数据库!模板是 Postgres 可以用来从已知状态(通过复制)非常快速地重新创建数据库的数据库。这甚至比 chop 表还要快,并且它允许我们在测试时跳过所有烦人的外键内容。

例如,您可以使用 raw 执行以下操作:

DROP DATABASE testdb;
CREATE DATABASE testdb TEMPLATE testdb_template;

这是一种非常便宜的操作,并且非常适合测试,因为每次进行测试运行时都可以从已知状态(不一定是空状态)开始。我想需要注意的是,您的 knexfile.js 需要指定与有足够凭据的用户的连接,以创建和删除数据库(因此可能是仅了解 localhost 的“管理员”连接),并且必须创建和维护模板。请参阅Template Databases了解更多。

关于javascript - 如何使用 Jest/Supertest/Knex/Postgres 处理外键约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59482478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com