node.js - Sequelize 和 Jest 在一起玩得不好

标签 node.js sequelize.js jestjs

更具体地说,我正在使用 Jest 的 globalSetupglobalTeardown函数/文件在开始时设置我的数据库一次,然后在最后关闭并删除表。

这并不是真正的最佳解决方案,但遗憾的是,它是唯一一种即使远程工作也不会出错的解决方案。理想情况下,我希望能够建立一次数据库连接,然后删除/清除表并在每个测试套件之后重新创建它们。通常,对于其他数据库(特别是 Mongoose/NoSQL),这可以通过 Jest 的 beforeAll/Each 来完成。和 afterAll/Each没问题,但遗憾的是,这会导致 Sequelize 出现很多错误,特别是它每次都尝试重新建立数据库连接,从而导致大量端口/监听错误。

我之所以说我当前使用全局文件的设置“有点”有效,是因为设置部分运行良好,但拆卸部分,AKA await db.dropAllSchemas({});根本不起作用。这些表格在所有测试中都会保留,除非我手动删除它们。

如果有人对此有任何经验,我理想情况下希望实现我在第一部分中发布的解决方案,但最坏的情况是我想修复我目前拥有的内容,以便在所有测试结束时删除表。

这是我用来尝试实现第一个解决方案(没有全局文件)的代码,它会导致所有错误;
设置测试框架.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...');
  }
};

最佳答案

我遇到了与您类似的问题,我通过在所有测试结束时关闭数据库连接来修复它。

在您的数据库配置文件中导出您的数据库并将其导入您的测试类中,然后您可以在所有测试结束时关闭连接。

afterAll(() => {
    db.close()
})

注意:当您删除所有模式时,它会删除所有表(对于 postgres db),而是在每个测试套件之后关闭连接。

关于node.js - Sequelize 和 Jest 在一起玩得不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54323006/

相关文章:

typescript - Sequelize 动态选择属性?作品?

node.js - Sequelize.Model 关系在 NodeJS 中不起作用

reactjs - 如何使用 jest/enzyme 中的 "current"属性测试 useRef

reactjs - 如何用 Jest 模拟 react 导航参数值

php - 如何使用 PHP mcrypt 加密并使用 Node Crypto 解密

mysql - Sequelize findOrCreate 在具有附加唯一键的模型上返回 SequelizeUniqueContraintError

node.js - DynamoDB 数据模型

reactjs - 类型错误 : Cannot read property 'forEach' of undefined jest

node.js - 如何在 Node.js 中包含一个不是模块的文件(使其成为一个模块)?

node.js - 使用 'Event' 调用类型时未调用 AWS Lambda