【发布时间】:2020-04-16 08:17:26
【问题描述】:
我正在尝试开始为我的应用程序编写测试。我正在使用 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 部分截断它们时,这些表的列出顺序似乎并不重要。
我不确定从这里到底该去哪里。任何帮助将不胜感激。
【问题讨论】:
标签: javascript node.js postgresql jestjs knex.js