javascript - 如何在 Jasmine 中测试 Sequelize?

标签 javascript node.js postgresql unit-testing sequelize.js

我使用以下代码在 database/index.ts 文件中初始化一个 sequelize db:

import { Sequelize } from 'sequelize';

const {
  DATABASE_DIALECT,
  DATABASE_HOST,
  DATABASE_PORT,
  DATABASE_USER_NAME,
  DATABASE_USER_PASSWORD,
  DATABASE_NAME,
  ENVIRONMENT
} = process.env;

const sequelize = new Sequelize({
  host: DATABASE_HOST,
  port: +(DATABASE_PORT as string),
  dialect: DATABASE_DIALECT as 'postgres',
  database: DATABASE_NAME,
  username: DATABASE_USER_NAME,
  password: DATABASE_USER_PASSWORD,
  logging:
    (ENVIRONMENT as string) === 'production' || (ENVIRONMENT as string) === 'acceptance'
      ? false
      : console.log,
  query: {
    raw: true // Receive a plain object/array as a response from Sequelize (default response contains a lot of Sequelize metadata)
  }
});


export default sequelize;

我需要测试 logging 属性,因为它由检查 ENV 的三元运算符确定。
为了测试这一点,我需要检查调用了 new Sequelize(...) 的参数。
这如何在 Jasmine 中完成?我读了很多文章,看起来我们无法监视 Sequelize 类本身来检查调用参数。

最佳答案

我没有大量使用 Sequelize,但是传递给 logging 的值似乎最终在 sequelize.options.logging 下(基于 https://github.com/sequelize/sequelize/blob/main/lib/sequelize.js#L277 )。所以在测试中引用 sequelize.options.logging 可能是最快的方法。

另一种方法可能是将对象文字(传递给 Sequelize 构造函数)存储在变量中。然后导出变量(使其在测试中可用)并将变量传递给 Sequelize(以继续实例化)。就像是:

export const sequelizeOptions = {
  host: DATABASE_HOST,
  port: +(DATABASE_PORT as string),
  dialect: DATABASE_DIALECT as 'postgres',
  database: DATABASE_NAME,
  username: DATABASE_USER_NAME,
  password: DATABASE_USER_PASSWORD,
  logging:
    (ENVIRONMENT as string) === 'production' || (ENVIRONMENT as string) === 'acceptance'
      ? false
      : console.log,
  query: {
    raw: true // Receive a plain object/array as a response from Sequelize (default response contains a lot of Sequelize metadata)
  }
};

const sequelize = new Sequelize(sequelizeOptions);

export default sequelize;
从理论上讲,上述内容应该与您现在拥有的内容相同。它捕获和暴露对象的唯一区别。

另一种方法可能是在 console.log 周围创建一个薄包装器,以便您可以监视包装器 - 然后将包装器作为构造函数选项的一部分传递:
export const logger = (...args: any[]) => console.log(...args);

const sequelize = new Sequelize({
  host: DATABASE_HOST,
  port: +(DATABASE_PORT as string),
  dialect: DATABASE_DIALECT as 'postgres',
  database: DATABASE_NAME,
  username: DATABASE_USER_NAME,
  password: DATABASE_USER_PASSWORD,
  logging:
    (ENVIRONMENT as string) === 'production' || (ENVIRONMENT as string) === 'acceptance'
      ? false
      : logger,
  query: {
    raw: true // Receive a plain object/array as a response from Sequelize (default response contains a lot of Sequelize metadata)
  }
});

关于javascript - 如何在 Jasmine 中测试 Sequelize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66569650/

相关文章:

javascript - Google Web Designer 横幅 验证时缺少点击标记检查

javascript - 添加滚动到 Lightbox2

javascript - 如何对需要其他模块的 Node.js 模块进行单元测试以及如何模拟全局 require 函数?

模板内的 JavaScript 循环

javascript - 如何根据鼠标位置更改光标?

javascript - 由于待处理的 MongoDB 连接(@hapi/lab、mongodb-memory-server、node),测试未完成

node.js - 错误 : ‘REPLACE_INVALID_UTF8’ is not a member of ‘v8::String’

java - 如何拦截 JTA 事务事件并获取对与事务关联的当前 EntityManager 的引用

c# - 系统.InvalidCastException : Specified cast is not valid in C# using postgres datareader

python - 存储 ENUM 值的 PostgreSQL ARRAY