更具体一点,我使用Jest的globalSetup
和globalTeardown
函数/文件从一开始就设置数据库,然后在末尾关闭并删除表。
这并不是真正的最佳解决方案,但可悲的是,它是即使没有错误也可以远程工作的唯一解决方案。理想情况下,我希望能够一次建立数据库连接,然后删除/清除表并在每个测试套件之后重新创建它们。通常,对于其他数据库(特别是Mongoose / NoSQL),这可以通过Jest的beforeAll/Each
和afterAll/Each
来解决,但很遗憾,这会导致Sequelize出现很多错误,特别是尝试重新启动-每次都要建立数据库连接,这会导致很多端口/监听错误。
我说我当前使用全局文件“ sort of”的设置有效的原因是,因为该设置部分运行良好,但是拆卸部分AKA await db.dropAllSchemas({});
却根本不起作用。除非我手动擦除它们,否则表会保留在所有测试中。
如果有人对此有任何经验,我理想地希望获得我在第一部分中发布的解决方案,但最坏的情况是我想修复我目前拥有的解决方案,因此它会在所有测试结束时删除表。
这是我用来尝试实现FIRST解决方案(没有全局文件)的代码,它会导致所有错误; setupTestFramework.js
import { db } from '../../src/startup/database';
beforeAll(async () => {
await db.sync();
});
afterAll(async () => {
await db.dropAllSchemas({});
});
此代码会导致错误;
SequelizeDatabaseError: Table 'db_tests.products' doesn't exist
它还会导致测试中的某种分散。某些初始测试通过了(主要是1-2,可能是因为它们在同一个DB连接上),但是在所有这些测试之后都失败了。
希望有人可以提供帮助,因为我还没有真正找到合适的解决方案。
编辑:
database.js
import config from 'config';
import Sequelize from 'sequelize';
import { info } from 'winston';
export const db = new Sequelize(
config.get('db.database'),
config.get('db.username'),
config.get('db.password'),
{
host: config.get('db.host'),
port: config.get('db.port'),
dialect: 'mysql',
operatorsAliases: false,
logging:
process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'test' ? null : console.log,
}
);
export default async () => {
try {
await db.authenticate();
info('Connected to database successfully...');
await db.sync();
} catch (error) {
throw new Error('Unable to connect to database...');
}
};
答案 0 :(得分:0)
我遇到了一个与您类似的问题,我通过在所有测试结束时关闭数据库连接来解决此问题。
在数据库配置文件中导出数据库并将其导入测试类中,然后可以在所有测试结束时关闭连接。
afterAll(() => {
db.close()
})
注意:删除所有架构时,它将删除所有表(对于postgres db),而是在每个测试套件之后关闭连接。