【发布时间】:2019-06-16 19:02:18
【问题描述】:
更具体地说,我使用 Jest 的 globalSetup 和 globalTeardown 函数/文件在开始时设置我的数据库,然后在最后关闭并删除表。
这并不是最好的解决方案,但遗憾的是,它是唯一一个即使在远程工作时也不会出错的解决方案。理想情况下,我希望能够建立一次数据库连接,然后在每个测试套件之后删除/清除表并重新创建它们。通常,对于其他数据库(特别是 Mongoose/NoSQL),这可以通过 Jest 的 beforeAll/Each 和 afterAll/Each 来完成,但遗憾的是这会导致 Sequelize 出现很多错误,特别是它试图重新建立数据库每次连接都会导致很多端口/监听错误。
我之所以说我当前使用全局文件的设置“有点”有效,是因为设置部分运行良好,但拆解部分,AKA await db.dropAllSchemas({}); 根本不起作用。除非我手动擦除它们,否则这些表在所有测试中都会保留。
如果有人对此有任何经验,理想情况下我希望实现我在第一部分中发布的解决方案,但最坏的情况是我想修复我目前拥有的问题,以便在所有测试结束时删除表格。
这是我用来尝试实现第一个解决方案(没有全局文件)的代码,它会导致所有错误; 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 次,可能是因为它们在同一个数据库连接上),但之后所有测试都失败了。
希望有人可以提供帮助,因为我还没有找到合适的解决方案。
编辑:
数据库.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...');
}
};
【问题讨论】:
-
您是否尝试过放弃 async / await 语法而只返回承诺?例如
beforeAll(() => db.sync())。所有的拆解/设置函数都应该处理 Promises,所以如果有问题,很可能出在你的数据库设置代码上。 -
@James 是的,已经尝试过这个,同样的问题。我实际上不确定我的设置代码现在是否可以正常工作,就像我的拆解代码一样。如果我将 console.log 放在这些函数中,它们会被打印出来,但如果我在里面使用 Sequelize 函数,它们甚至不会运行。例如,如果我手动删除所有表,然后运行我的测试,它会抱怨这些表不存在(即使我的设置应该已经创建/同步了它们),但是如果我再次运行,它会找到它们.我认为这里发生了一些可疑的事情。
-
是的,正如我所说,在我看来,问题在于您的代码无法正常工作,因为这种类型的事情将是 Jest 的一个巨大错误,现在肯定已经被抓住了。如果您发布设置代码,我们可以看到发生了什么。
-
@James 是的,我就是这么想的。你到底需要什么代码?我的
globalSetup和globalTeardown?我的实际数据库设置文件?我的超测设置?让我知道您需要什么,我会将其编辑到 OP 中。 :) -
我想说让我们从代码示例中导入的文件开始,如果需要,您可以省略任何敏感信息
标签: node.js sequelize.js jestjs